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
相关产品推荐
相关产品推荐

