You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:02:44