JavaScript如何从对象数组中筛选出name属性重复的所有对象
问题分析与修复方案
你的代码存在两处核心错误导致最终filters为空:
- 属性名大小写不匹配:你定义的对象属性是小写
name,但过滤时写的是大写开头的x.Name,JavaScript的对象属性名大小写敏感,永远匹配不到对应值。 - 匹配逻辑错误:
resultName是存储重复名称的数组,不能直接用===判断单个字符串和数组是否相等,需要调用数组的includes()方法判断当前对象的name是否在重复名单内。
另外你当前的toFindDuplicates方法如果遇到同一名称重复3次及以上的情况,会在resultName里生成重复的名称条目,建议优化为返回去重后的重复名称集合,避免不必要的性能损耗。
修复后完整代码
const data = [ {id: 1,name: "Liam",age: 20}, {id: 1,name: "Noah",age: 22}, {id: 1,name: "Liam",age: 20}, {id: 1,name: "Elijah",age: 18}, {id: 1,name: "Elijah",age: 18} ] // 提取所有name const searchName = data.map(item => item.name) console.log(searchName); // 优化后的找重复值方法,返回去重后的重复名称 const toFindDuplicates = arry => Array.from(new Set(arry.filter((item, index) => arry.indexOf(item) !== index))); const resultName = toFindDuplicates(searchName) console.log(resultName); // 修复属性名和匹配逻辑 const filters = data.filter(x => resultName.includes(x.name)) console.log(filters);
输出结果
运行后filters会正确返回所有name重复的对象:
[ { id: 1, name: 'Liam', age: 20 }, { id: 1, name: 'Liam', age: 20 }, { id: 1, name: 'Elijah', age: 18 }, { id: 1, name: 'Elijah', age: 18 } ]
内容的提问来源于stack exchange,提问作者Good
相关产品推荐
相关产品推荐

