使用过滤器从对象数组中删除多个对象

时间:2017-11-03 22:55:04

标签: javascript arrays javascript-objects

鉴于,

someArray = [{name:"Kristian", lines:"2,5,10"},
             {name:"John", lines:"1,19,26,96"},
             {name:"Brian",lines:"3,9,62,36" }];

removeArray = [{name:"Kristian", lines:"2,5,10"},
             {name:"Brian",lines:"3,9,62,36" }];

如何从someArray中删除removeArray的对象? 我可以删除一个对象:

johnRemoved = someArray.filter(function(el) {
return el.name !== "John";
});

但是,我不想将someArray名称与字符串进行比较,而是将它们与removeArray中的名称进行比较。可以使用第二种过滤方法完成,还是必须是for循环?

6 个答案:

答案 0 :(得分:1)

您可以使用filter this对象等于需要删除的名称集(效率Set):

someArray = [{name:"Kristian", lines:"2,5,10"},
             {name:"John", lines:"1,19,26,96"},
             {name:"Brian",lines:"3,9,62,36" }];

removeArray = [{name:"Kristian", lines:"2,5,10"},
             {name:"Brian",lines:"3,9,62,36" }];
             
someArray = someArray.filter(function(obj) {
    return !this.has(obj.name);
}, new Set(removeArray.map(obj => obj.name)));

console.log(someArray);

答案 1 :(得分:1)

你只需要第二次一些迭代:

johnRemoved = someArray.filter( obj => !removeArray.some( obj2 => obj.name === obj2.name ));

答案 2 :(得分:1)

someArray.filter(i => !removeArray.map(j => j.name).includes(i.name));

或者如果您不希望使用includes超越ES6:

someArray.filter(i => !removeArray.some(j => j.name === i.name));

或使用reduce

someArray.reduce((acc, i) => {
  !removeArray.some(j => j.name === i.name) && acc.push(i);
  return acc;
}, []);

答案 3 :(得分:1)

Filtersome

someArray.filter(function(item) {
    return !removeArray.some(function(r) { return r.name == item.name && r.lines == item.lines })
});

答案 4 :(得分:0)

这应该可以解决问题。

const removed = someArray.filter((e) => {
    return removeArray.find(r => r.name === e.name) !== undefined;
});

答案 5 :(得分:0)

我喜欢这里给出的答案。我也想添加自己的。

1 - 两个Array.prototype.filter()方法,第一个用于迭代的过滤器:

removeArray.filter(function(ra) {
    someArray = someArray.filter(function(sa) {
        return sa.name !== ra.name;
    });
});

2 - 第一次迭代可以用for...of循环代替

for (let item of removeArray){

3-或Array.prototype.forEach()

removeArray.forEach(function(ra) {

4- dubbhaAdamJonas wArray.prototype.some():

someArray.filter(i => !removeArray.some(j => j.name === i.name));

5-最后trincot的回答对我很有意思:

someArray = someArray.filter(function(obj) {
  return !this.has(obj.name);
}, new Set(removeArray.map(obj => obj.name)));