编写getDuplicates函数遇问题:重复元素返回结果不符合预期
问题排查与修复
原代码的核心问题
- 数组全等判断无效:
items === [0,0,0,0]永远不会成立。数组是引用类型,===比较的是内存地址而非内容,哪怕两个数组内容完全一致,这个判断也不会触发。 - 重复添加元素:双重循环中每找到一对重复元素就往
result里push一次,导致同一个元素被多次添加。比如输入[0,0,0,0]时,会触发6次push操作,最终得到6个0的数组。 - 缺少去重逻辑:没有机制保证同一元素只在结果数组中出现一次。
修复后的代码方案
以下两种实现都能满足「返回出现多次的元素、保留原顺序、同一元素仅返回一次」的要求:
方案一:遍历过程中实时判断(高效)
function getDuplicates(items) { const result = []; const seen = new Set(); // 记录已经遍历过的元素 const added = new Set(); // 记录已经加入结果的元素 for (const item of items) { if (seen.has(item)) { // 元素已出现过,且未加入结果时才添加 if (!added.has(item)) { result.push(item); added.add(item); } } else { seen.add(item); } } return result; }
方案二:先统计次数再筛选(直观)
function getDuplicates(items) { const countMap = new Map(); // 第一步:统计每个元素的出现次数 for (const item of items) { countMap.set(item, (countMap.get(item) || 0) + 1); } const result = []; const added = new Set(); // 第二步:按原数组顺序筛选出出现次数>1的元素,且仅添加一次 for (const item of items) { if (countMap.get(item) > 1 && !added.has(item)) { result.push(item); added.add(item); } } return result; }
测试验证
输入[0,0,0,0]时,两种方案都会返回[0];输入[1,2,2,3,3,3,4]时,会返回[2,3],完全符合需求。
内容的提问来源于stack exchange,提问作者Vladyslav Akopov
相关产品推荐
相关产品推荐

