如何从对象数组a中过滤出对象数组b中不存在的元素?
解决JavaScript数组过滤问题
给定两个对象数组:
let a = [{name:'Hari',age:2},{name:'Chana',age:4},{name:'Like',age:5}] let b = [{name:'Chana',age:14},{name:'Like',age:15}];
你原来的代码:
let c =a.filter(elm => b.find(el => el.name === elm.name));
之所以不符合预期,是因为b.find(...)会返回b中匹配name的对象(属于真值),所以filter会保留a中在b里存在同名的元素,最终结果和你要的刚好相反。
要得到预期的[{name:'Hari',age:2}],只需要对查找结果取反,保留a中在b里找不到同名的元素,以下是两种实现方式:
方法一:直接取反(简单场景)
直接在原代码基础上添加取反符号,逻辑清晰适合小数据量:
let c = a.filter(elm => !b.find(el => el.name === elm.name));
方法二:用Set优化(大数据量场景)
如果数组元素较多,find每次遍历b数组的效率较低,可以先把b里的name提取到Set中,利用Set的O(1)查找性能提升效率:
// 先提取b中所有name存入Set const bNameSet = new Set(b.map(item => item.name)); // 过滤a中name不在Set内的元素 let c = a.filter(elm => !bNameSet.has(elm.name));
内容的提问来源于stack exchange,提问作者Rijo
相关产品推荐
相关产品推荐

