从另一个对象数组中删除对象数组

时间:2017-10-30 14:30:02

标签: javascript

假设我们根据属性id比较了以下对象数组:

a = [{'id':'1', 'name':'a1'}, {'id':'2', 'name':'a2'}, {'id':'3', 'name':'a3'}]

b = [[{'id':'2', 'name':'a2'}, ]

如何从a中减去b?因此我们c = a - b应该等于[ {'id':'1', 'name':'a1'}, {'id':'3', 'name':'a3'}]

我尝试过使用它:

var c= a.filter(function(item) {
                    return !b.includes(item.id);
                });

但仍无效。

4 个答案:

答案 0 :(得分:4)

这个解决方案怎么样?它假定' b'也是一个数组,所以对于' a'检查' b'中是否有匹配的对象。如果存在匹配的对象,则在过滤器函数中返回false,以便丢弃该元素。



var a = [{
  'id': '1',
  'name': 'a1'
}, {
  'id': '2',
  'name': 'a2'
}, {
  'id': '3',
  'name': 'a3'
}]
var b = [{
  'id': '2',
  'name': 'a2'
}]

var c = a.filter(function(objFromA) {
  return !b.find(function(objFromB) {
    return objFromA.id === objFromB.id
  })
})

console.log(c)




答案 1 :(得分:2)

这是一个很好的答案:)

基本上,您可以过滤,就像您尝试过的那样。然后你也可以为每个元素过滤b,如果过滤的b的长度为零,那么你返回true,因为这意味着a元素对于a是唯一的。



var a = [{
  'id': '1',
  'name': 'a1'
}, {
  'id': '2',
  'name': 'a2'
}, {
  'id': '3',
  'name': 'a3'
}];

var b = [{
  'id': '2',
  'name': 'a2'
}];

c = a.filter( x => !b.filter( y => y.id === x.id).length);
console.log(c);




答案 2 :(得分:0)

首先,您只构建要删除的ID的映射。 然后,用它过滤你的第一个数组:



var a = [{
  'id': '1',
  'name': 'a1'
}, {
  'id': '2',
  'name': 'a2'
}, {
  'id': '3',
  'name': 'a3'
}];
var b = [{
  'id': '2',
  'name': 'a2'
}];

var idsToDelete = b.map(function(elt) {return elt.id;});
var result = a.filter(function(elt) {return idsToDelete.indexOf(elt.id) === -1;});
console.log(result)




答案 3 :(得分:0)

易于使用新的ES6语法

我认为第二和第三种方式的性能更高....

a.filter(i => !b.filter(y => y.id === i.id).length); // One Way
a.filter(i => !b.find(f => f.id === i.id)); // Second Way
a.filter(i => b.findIndex(f => f.id === i.id)) // Third Way