如何在JS中获取所有值重复的对象?求高效实现方案
高效获取数组中所有值重复的对象
嘿,我来分享一个高效的实现思路,能帮你一次遍历就搞定这个需求,比先统计所有value的出现次数再二次过滤的方案更省时间,尤其适合处理大数据量的场景。
核心思路
我们可以在遍历数组的过程中,同时完成两个关键任务:
- 用
Map记录每个value第一次出现时对应的对象 - 当再次遇到同一个
value时,把之前记录的对象(如果还没加入结果)和当前对象一起加入结果集,同时标记该value的记录,避免后续重复添加历史对象
代码实现
const data = [ { name: 'a' , value: '123'}, { name: 'b' , value: '123'}, { name: 'c' , value: '1234'}, { name: 'd' , value: '1234'}, { name: 'e' , value: '12345'}, { name: 'f' , value: '123456'} ]; const result = []; const valueTracker = new Map(); for (const item of data) { const { value } = item; if (valueTracker.has(value)) { const firstOccurrence = valueTracker.get(value); // 如果是第一次遇到重复,先把首次出现的对象加入结果 if (firstOccurrence) { result.push(firstOccurrence); // 标记为null,防止后续再次添加这个首次对象 valueTracker.set(value, null); } // 添加当前对象到结果 result.push(item); } else { // 首次遇到该value,暂存对象到Map中 valueTracker.set(value, item); } } console.log(result); // 输出:[ { name: 'a', value: '123' }, { name: 'b', value: '123' }, { name: 'c', value: '1234' }, { name: 'd', value: '1234' } ]
为什么这个方案高效?
- 时间复杂度O(n):只需要遍历一次原数组,没有额外的二次过滤操作
- 空间复杂度O(k):k是数组中不同
value的数量,这是实现需求的必要开销,无法避免 - 逻辑简洁:在遍历过程中实时处理重复项,不需要额外存储完整的次数统计数据
内容的提问来源于stack exchange,提问作者SPG
相关产品推荐
相关产品推荐

