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

JavaScript无需第三方库如何从大规模对象数组提取指定key的重复项

JavaScript 高效查找对象数组中指定key重复的所有条目

针对百万级数据量的场景,推荐使用时间复杂度为O(n)的实现方案,仅通过1-2次线性遍历即可得到结果,不会出现嵌套遍历的性能雪崩问题。

核心实现思路

利用原生Map的O(1)读写特性,先按指定key对数组条目分组/统计出现次数,再筛选出出现次数≥2的key对应的所有条目即可。

通用实现(代码简洁,适合大多数场景)

/**
 * 查找数组中指定key重复的所有条目
 * @param {Array} arr 待处理的对象数组
 * @param {String} duplicateKey 判定重复的key名
 * @returns {Array} 所有符合重复条件的条目
 */
function findDuplicateEntries(arr, duplicateKey) {
  const groupMap = new Map();
  // 一次遍历完成分组
  for (const item of arr) {
    const keyValue = item[duplicateKey];
    groupMap.has(keyValue) ? groupMap.get(keyValue).push(item) : groupMap.set(keyValue, [item]);
  }
  // 过滤出重复分组并扁平化返回
  return Array.from(groupMap.values())
    .filter(group => group.length >= 2)
    .flat();
}

低内存优化版本(适合超大规模、低重复率场景)

如果你的数据量极大且重复率极低,可使用两次遍历的方案,减少Map存储的内存开销:

function findDuplicateEntriesLowMemory(arr, duplicateKey) {
  const countMap = new Map();
  // 第一次遍历仅统计每个key的出现次数
  for (const item of arr) {
    const keyValue = item[duplicateKey];
    countMap.set(keyValue, (countMap.get(keyValue) || 0) + 1);
  }
  // 第二次遍历收集所有重复条目
  const result = [];
  for (const item of arr) {
    if (countMap.get(item[duplicateKey]) >= 2) {
      result.push(item);
    }
  }
  return result;
}

测试示例

使用你提供的测试用例调用:

const myArray = [
    { 'id': 111, 'lorem': 'ipsum' },
    { 'id': 222, 'lorem': 'dorem' },
    { 'id': 111, 'lorem': 'polus' },
    { 'id': 111, 'lorem': 'waifu' },
];

console.log(findDuplicateEntries(myArray, 'id'));

输出结果和你预期的完全一致:

[
    { 'id': 111, 'lorem': 'ipsum' },
    { 'id': 111, 'lorem': 'polus' },
    { 'id': 111, 'lorem': 'waifu' },
]

性能说明

两个实现的时间复杂度均为线性级O(n),即使处理数百万条数据也能在极短时间内完成,不会出现嵌套循环O(n²)复杂度在数据量超过1万后就出现的卡顿问题。

内容的提问来源于stack exchange,提问作者Zach Smith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 16:54:04