简体   繁体   English

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

[英]Remove multiple object from array of objects using filter

Given, 鉴于

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" }];

How do I remove objects of removeArray from someArray? 如何从someArray删除removeArray的对象? I can remove a single object: 我可以删除一个对象:

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

However, instead of comparing someArray names to a string, I'd like to compare them to names in removeArray. 但是,与其将someArray名称与字符串进行比较,不如将它们与removeArray中的名称进行比较。 Can it be done with a second filter method or does it have to be a for loop? 可以使用第二种过滤器方法完成它,还是必须使用for循环?

You could use filter with the this object equal to the set of names that need removal (a Set for efficiency): 您可以在this对象使用filter使用该filter ,该filter等于需要删除的名称Set为提高效率而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); 

您只需要进行一些迭代即可:

johnRemoved = someArray.filter( obj => !removeArray.some( obj2 => obj.name === obj2.name ));
someArray.filter(i => !removeArray.map(j => j.name).includes(i.name));

or if you don't want to go beyond ES6 with includes : 或者,如果您不希望超越ES6的includes

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

or using reduce : 或使用reduce

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

Filter and some : 过滤器一些

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

I like the answers given here. 我喜欢这里给出的答案。 I wanted to add my own as well. 我也想添加自己的。

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

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

2 - first iteration can be replaced by for...of loop 2-第一次迭代可以替换为for ... of循环

for (let item of removeArray){

3- or by Array.prototype.forEach() 3或通过Array.prototype.forEach()

removeArray.forEach(function(ra) {

4- as dubbha , Adam and Jonas w mentioned, Array.prototype.some( ): 4-如dubbhaAdamJonas所提到的, Array.prototype.some( ):

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

5- lastly trincot 's answer was interesting for me: 5-最后Trincot的答案对我来说很有趣:

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

That should do the trick. 这应该够了吧。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM