如何高效获取嵌套数组中的重复数字?现有实现能否优化?
问题:高效处理嵌套数组,找出重复出现的数字
我知道可以用大量if...else实现,但需要更快更高效的方法。我需要一个能遍历嵌套数组、返回其中出现多次的数字的函数。之前参考的方法不适用于嵌套数组,就算用flat(),当重复次数超过2次时代码也会失效。
示例
deepSort([[1,3,4,5], [4,7,9,1,3], [2,3,5], [1,2,3,4]]) // 返回"1,2,3,4,5" deepSort([[1,2,3], [4,5], [6,7,8], [2,9,0]]) // 返回"2" deepSort([[2,7,9], [4,3], [9,6,5], [1,4,3]]) // 返回"3,4,9"
我的尝试实现
function deepSort(nestedArray) { const flatArr = nestedArray.flat().sort(); let results = [] for (let i = 0; i < flatArr.length - 1; i++) { if (flatArr[i + 1] == flatArr[i]) { results.push(flatArr[i]); } } return (results.filter((item,index) => results.indexOf(item) === index)).join() }
优化方案(针对大数据场景)
你的当前实现存在几个影响效率的问题:
- 排序开销过大:
sort()的时间复杂度是O(n log n),大数据量下会占用大量计算资源,而统计重复次数根本不需要先排序。 - 去重操作低效:
results.filter(...)里用indexOf做去重,每次查找都是O(k)(k为results长度),整体是O(k²)的时间复杂度,数据量大时会明显变慢。
更高效的实现思路是用哈希表(Map)统计出现次数,只需要遍历一次所有元素,再筛选出符合条件的数字即可:
function deepSort(nestedArray) { const countMap = new Map(); // 递归遍历嵌套数组,统计每个数字的出现次数 const traverse = (arr) => { for (const item of arr) { Array.isArray(item) ? traverse(item) : countMap.set(item, (countMap.get(item) || 0) + 1); } }; traverse(nestedArray); // 筛选出现次数≥2的数字,排序后转为字符串(和原实现输出顺序一致) return Array.from(countMap.entries()) .filter(([num, count]) => count >= 2) .map(([num]) => num) .sort((a, b) => a - b) .join(','); }
优化点说明:
- 避免不必要的扁平化:直接递归遍历嵌套数组,比
flat()更适配不确定深度的嵌套场景,也省去了扁平化的额外开销。 - 哈希表统计更高效:遍历所有元素的时间复杂度是O(n)(n为总元素数),远优于原实现中排序的O(n log n)。
- 无额外去重步骤:直接从哈希表提取符合条件的数字,不需要再做二次去重,大幅降低了后续处理的开销。如果不需要结果有序,可以去掉最后的
sort步骤,进一步提升速度。
内容的提问来源于stack exchange,提问作者Joseph Etim
相关产品推荐
相关产品推荐

