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

如何在JavaScript中编写函数查找数组中第一个重复元素的索引?

问题分析与修复方案

嘿,我来帮你排查代码问题并解决需求~ 你的代码现在跑不起来主要有几个核心问题,咱们一个个说:

你的代码里的问题

  • firstIndex初始化错误:你只声明了let firstIndex;,它默认是undefined,但后面却直接调用firstIndex.indexOf()和firstIndex.push()——这俩都是数组的方法,undefined根本没有这些属性,一运行就会抛出类型错误。
  • 语法漏洞:for循环里的if语句没加大括号,导致firstIndex.push(array[i]);不受if条件控制,不管判断结果如何都会执行,直接触发上面的错误。
  • 逻辑偏离需求:你的代码看起来是想收集不重复元素,但需求是找到第一个出现重复的元素的索引,不是返回去重后的数组。

修复后的代码(完全贴合你的需求)

下面的代码会帮你找到数组中最先出现重复的元素的首次索引,并且按要求打印出来:

const numbers = [2, 4, 5, 2, 3, 5, 1, 2, 4];

function indexOfRepeatedValue(array) {
  let firstIndex;
  // 用Map来记录已遍历元素及其第一次出现的索引,查找效率更高
  const seenElements = new Map();

  for (let i = 0; i < array.length; i++) {
    const current = array[i];
    // 检查当前元素是否已经出现过
    if (seenElements.has(current)) {
      // 找到第一个重复元素,它的首次出现索引就是我们要的firstIndex
      firstIndex = seenElements.get(current);
      // 找到后立刻跳出循环,不用继续遍历啦
      break;
    } else {
      // 没出现过的话,把元素和当前索引存起来
      seenElements.set(current, i);
    }
  }

  // 按要求打印firstIndex
  console.log(firstIndex);
  // 如果需要返回这个值供后续使用,可以保留return
  return firstIndex;
}

// 调用函数
indexOfRepeatedValue(numbers); // 控制台输出0,因为第一个重复的元素是2,它第一次出现的索引是0

如果你的需求是获取第一次发现重复时的当前索引(比如示例中2第二次出现的索引3),只需要把firstIndex = seenElements.get(current);改成firstIndex = i;就行。

额外小建议

  • 用Map(或者普通对象)记录已出现元素,比用数组indexOf效率高很多——数组indexOf是逐个查找(O(n)复杂度),而Map.has()是直接查找(O(1)复杂度),数组越大差异越明显。
  • 找到目标后及时break循环,避免做无用功,提升代码性能。
  • 变量命名尽量清晰,比如seenElements就比模糊的命名更容易理解,后期维护也方便。

内容的提问来源于stack exchange,提问作者Jakub Skorus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 16:57:28