如何从对象数组中筛选出name与age均相同的重复元素
解决数组中筛选name和age均相同元素的问题
给定数组:
data= [ { "id": 0, "name": "name1", "age": 12, "city": "cityA" }, { "id": 1, "name": "name2", "age": 7, "city": "cityC" }, { "id": 2, "name": "name3", "age": 23, "city": "cityB" }, { "id": 2, "name": "name1", "age": 12, "city": "cityA" } ];
需求是提取出所有name和age属性完全相同的元素。你之前写的代码会返回全部元素,问题出在逻辑判断上——你用some遍历数组时,内部循环匹配元素时没排除自身,而且只要找到匹配就直接push,导致每个元素都能匹配到自己,最终所有元素都被加入结果数组。
下面给两种可行的实现方案:
方案一:哈希表统计(高效,适合大数据量)
先统计每个name+age组合的出现次数,再筛选出次数大于1的元素:
const data = [ { "id": 0, "name": "name1", "age": 12, "city": "cityA" }, { "id": 1, "name": "name2", "age": 7, "city": "cityC" }, { "id": 2, "name": "name3", "age": 23, "city": "cityB" }, { "id": 2, "name": "name1", "age": 12, "city": "cityA" } ]; // 统计每个name+age组合的出现次数 const countMap = {}; data.forEach(item => { const key = `${item.name}-${item.age}`; countMap[key] = (countMap[key] || 0) + 1; }); // 筛选出重复出现的元素 const result = data.filter(item => { const key = `${item.name}-${item.age}`; return countMap[key] > 1; }); console.log(result);
执行后输出的结果就是所有name和age都相同的元素:
[ { id: 0, name: 'name1', age: 12, city: 'cityA' }, { id: 2, name: 'name1', age: 12, city: 'cityA' } ]
方案二:嵌套循环对比(适合小数据量)
通过嵌套循环对比元素,排除自身后找到匹配项:
const data = [ { "id": 0, "name": "name1", "age": 12, "city": "cityA" }, { "id": 1, "name": "name2", "age": 7, "city": "cityC" }, { "id": 2, "name": "name3", "age": 23, "city": "cityB" }, { "id": 2, "name": "name1", "age": 12, "city": "cityA" } ]; const result = new Set(); // 嵌套循环对比,排除自身索引 data.forEach((item, idx) => { data.forEach((otherItem, otherIdx) => { if (idx !== otherIdx && item.name === otherItem.name && item.age === otherItem.age) { result.add(item); result.add(otherItem); } }); }); // 把Set转成数组 const finalResult = Array.from(result); console.log(finalResult);
原代码问题分析
你之前的代码里,data.some()会遍历每个元素,内部循环form(假设form就是data)时,每个元素都会匹配到自身,导致所有元素都被push到arr里。要修复的话,需要在匹配时排除当前元素的索引,并且避免重复添加相同元素。
内容的提问来源于stack exchange,提问作者VMG
相关产品推荐
相关产品推荐

