如何高效返回仅含重复项的数组?(基于指定属性判断)
如何依据指定属性快速找出数组中的重复项?
当然有简便的实现方法啦!给你分享两种实用又简洁的JavaScript方案,完美匹配你的需求——只靠name和description判断重复,返回每个重复组的首个出现项:
方法一:用Map追踪首次出现的重复项
核心思路是用Map存储每个name+description组合第一次出现的元素,遍历数组时发现重复就把首次元素加入结果(确保只加一次):
const array = [ { name: 'name1', description:'desc1', place:'place1' }, { name: 'name1', description:'desc1', place:'place2' }, { name: 'name3', description:'desc3', place:'place3' }, { name: 'name4', description:'desc4', place:'place4' }, { name: 'name4', description:'desc4', place:'place4' }, { name: 'name5', description:'desc5', place:'place5' } ]; // 生成唯一标识:把name和description组合成键 const getUniqueKey = item => `${item.name}|${item.description}`; const seenItems = new Map(); const duplicates = []; array.forEach(item => { const key = getUniqueKey(item); if (seenItems.has(key)) { // 只在第一次发现重复时,把首次出现的项加入结果 if (!duplicates.some(dup => getUniqueKey(dup) === key)) { duplicates.push(seenItems.get(key)); } } else { // 首次遇到该组合,存入Map seenItems.set(key, item); } }); console.log(duplicates); // 输出结果完全符合你的预期
方法二:用reduce统计次数后筛选
这个方法更简洁,先通过reduce统计每个组合的出现次数并记录首次元素,再直接筛选出重复项:
const array = [/* 你的原数组 */]; const getUniqueKey = item => `${item.name}|${item.description}`; // 统计每个组合的出现次数和首次出现的元素 const countTracker = array.reduce((acc, item) => { const key = getUniqueKey(item); if (!acc[key]) { acc[key] = { count: 0, firstOccurrence: item }; } acc[key].count++; return acc; }, {}); // 筛选出出现次数>1的组合,取其首次元素 const duplicates = Object.values(countTracker) .filter(tracker => tracker.count > 1) .map(tracker => tracker.firstOccurrence); console.log(duplicates);
小细节优化:避免键冲突
如果你的name或description里可能包含|符号,会导致键生成冲突,建议换用更安全的键生成方式:
const getUniqueKey = item => JSON.stringify([item.name, item.description]);
用JSON序列化数组的方式生成键,能彻底避免分隔符冲突的问题。
内容的提问来源于stack exchange,提问作者ove
相关产品推荐
相关产品推荐

