为何无法向数组push(-1)?求更优重复数字统计方案
问题解决与优化实现
问题原因及修复
你代码中无法推入-1的核心问题是数组为空的判断逻辑错误:
在JavaScript里,数组是引用类型,result == []比较的是两个数组对象的引用地址,而非内容,因此这个判断永远为false,导致无法执行push(-1)。
只需将判断条件改为检查数组长度:
// 替换原代码中的if判断 if (result.length === 0) { result.push(-1); }
修改后,第三个测试用例map([3,5,7,9,1])会正确返回[-1]。
从前往后统计的优化实现
如果需要严格按照数组中元素第一次出现的顺序收集重复次数(避免重复处理同一元素),可以使用以下更简洁高效的实现:
function countDuplicates(arr) { // 用reduce一次性统计元素出现次数 const countMap = arr.reduce((map, num) => { map.set(num, (map.get(num) || 0) + 1); return map; }, new Map()); const result = []; const processed = new Set(); // 按数组遍历顺序,只收集首次出现的重复元素次数 for (const num of arr) { if (!processed.has(num) && countMap.get(num) > 1) { result.push(countMap.get(num)); processed.add(num); } } // 空结果时返回[-1] return result.length === 0 ? [-1] : result; } // 测试用例 console.log(countDuplicates([1, 2, 3, 3, 3, 3, 4, 4])); // [4, 2] console.log(countDuplicates([3, 2, 4, 4, 2, 5, 2, 5, 5])); // [3, 2, 3] console.log(countDuplicates([3, 5, 7, 9, 1])); // [-1]
优化点说明
- 用
reduce替代单独的forEach统计次数,代码更紧凑 - 遍历原数组结合
Set,确保按元素首次出现顺序添加结果,完全符合“从前往后统计”的需求 - 直接使用数字作为Map的键,避免了原代码中不必要的字符串转换
- 逻辑分层清晰,可读性和维护性更强
内容的提问来源于stack exchange,提问作者Rachel
相关产品推荐
相关产品推荐

