为何JavaScript代码中duplicates数组未接收nums数组的第二个值?
问题原因分析
你的代码里判断元素是否已被记录的逻辑存在bug:
当遍历到第一个1时,unique[1]被赋值为它的索引0。在JavaScript中,0属于假值,所以第二次遇到1时,!unique[1]的结果是true(因为!0 === true),这会再次执行unique[1] = i(把索引更新为1),而不会进入else分支去检查是否要将1加入duplicates数组。
简单来说,你用索引值作为unique对象的属性值,当元素第一次出现在索引0的位置时,属性值是0,后续判断会误以为这个元素还没被记录过。
修复方案
可以通过两种方式解决这个问题:
方案1:修改unique的赋值逻辑
把unique对象的属性值改成布尔值,避免假值干扰判断:
function duplicateNumbers(nums) { let unique = {}; let duplicates = []; for (let i = 0; i < nums.length; i++) { if (!unique[nums[i]]) { unique[nums[i]] = true; // 用布尔值标记已存在 } else { if (duplicates.indexOf(nums[i]) == -1) { duplicates.push(nums[i]); } } } return duplicates; } console.log(duplicateNumbers([1, 1, 5, 5, 5, 5, 7, 5, 3, 3, 3])) // 输出 [1,5,3]
方案2:用Set简化实现
利用Set的唯一性特性,代码更简洁高效:
function duplicateNumbers(nums) { const seen = new Set(); const duplicates = new Set(); for (const num of nums) { seen.has(num) ? duplicates.add(num) : seen.add(num); } return Array.from(duplicates); } console.log(duplicateNumbers([1, 1, 5, 5, 5, 5, 7, 5, 3, 3, 3])) // 输出 [1,5,3]
内容的提问来源于stack exchange,提问作者Md Ishaq
相关产品推荐
相关产品推荐

