2016-02-26 15 views
0

我有一個「濾鏡對象」,如:JS深比較2個對象和除去在第二找到的項目而不是第一

var filterObj = { name: '', 
     age: '', 
     address: {street: '', city: ''}, 
     friends: [name: ''] 
    } 

然後一個對象,例如:

var obj = { name: 'Bob', 
     age: '23', 
     car: 'Ford' 
     address: {street: '1 the street', city: 'Gotham'}, 
     friends: [ {name: 'Tony'}, {name: 'Sandra' }] 
    } 

我想將第二個對象與第一個對象進行比較,並刪除第一個未找到的第二個對象。我有這樣的:

filterData: function (obj, filterObj) { 

    var newObj = {};  

    for (var key in filterObj) { 

     if (obj.hasOwnProperty(key)) { 

     if (typeof obj[key] == 'object' && typeof filterObj[key] == 'object' || typeof filterObj[key] == 'array') { 
      newObj[key] = this.filterData(obj[key], filterObj[key]); 

     }else { 
      newObj[key] = obj[key]; 
     } 
     } 
    } 

    return newObj;  

} 

,幾乎工作,但只保留數組中的第一項,然後將陣列切換到一個對象。

所以我的預期成果是:

var result = { name: 'Bob', 
      age: '23',    
      address: {street: '1 the street', city: 'Gotham'}, 
      friends: [ {name: 'Tony'}, {name: 'Sandra' }] 
     } 

JS小提琴: https://jsfiddle.net/ddqLqz9d/

+0

'變種ARR = []; typeof arr' returns'「object」';嘗試使用'Array.isArray(arr)' – guest271314

+0

我知道你只使用jQuery,但你可能會對lodash的defaultsDeep()函數感興趣:https://lodash.com/docs#defaultsDeep不知道它會與內部array雖然 – phenxd

+0

你的代碼可以簡單得多,如果它與對象引用,而不是複製 – hindmost

回答

0

typeof []回報"object"。嘗試使用Array.isArray()來檢查作爲數組的屬性的值;改變if條件

if (typeof obj[key] == 'object' && typeof filterObj[key] == 'object' 
      /* check if `obj[key]` and `filterObj[key]` are arrays */ 
      && ![obj[key], filterObj[key]].every(Array.isArray)) 

https://jsfiddle.net/ddqLqz9d/1/的jsfiddle

相關問題