[英]Remove multiple object from array of objects using filter
鉴于
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循环?
您可以在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));
或者,如果您不希望超越ES6的includes
:
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;
}, []);
我喜欢这里给出的答案。 我也想添加自己的。
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){
removeArray.forEach(function(ra) {
4-如dubbha , Adam和Jonas所提到的, Array.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)));
这应该够了吧。
const removed = someArray.filter((e) => {
return removeArray.find(r => r.name === e.name) !== undefined;
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.