JS深度比较2个对象并删除在第二个对象中找到的项目,而不是第一个

JS deep compare 2 objects and remove items found in the second but not the first

本文关键字:对象 项目 第一个 2个 比较 深度 删除 第二个 JS      更新时间:2023-09-26

我有一个"过滤器对象",例如:

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/

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))

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