You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 11:45:45