如何使用for循环返回数组中第一次出现的重复项?

jsL*_*ner 2 javascript arrays for-loop

我正在尝试使用数组和数据结构构建逻辑.我正在尝试使用for循环实现逻辑

function getRepeatingNumber(arr) {

  for (var i = 0; i < arr.length; i++) {
    for (var j = i + 1; j < arr.length; j++) {
      if (arr[i] === arr[j]) {
        return arr[i];
      }
    }
  }
  return undefined;
}
getRepeatingNumber([2, 3, 6, 5, 2]);
Run Code Online (Sandbox Code Playgroud)

上面的函数接受数组并返回数组中的重复项,所以在上面的例子中它将返回2.但是如果我有一个类似这样的数组arr [2,3,3,6,5,2] case它应该返回3但是因为外部循环有索引[0],它是2作为参考,它将返回2作为答案.

如何实现一个返回重复项的第一次出现的函数.

tri*_*cot 5

而不是j后面 的部件中迭代i,迭代部件之前 i:

function getRepeatingNumber(arr){
    for (var i = 1; i < arr.length; i++) {
        for (var j = 0; j < i; j++) {
            if (arr[i] === arr[j]) {
                return arr[i];
            }
        }
    }
}
console.log(getRepeatingNumber([2,3,3,6,5,2]));
Run Code Online (Sandbox Code Playgroud)

请注意,return undefined不需要显式,这是默认行为.

你也可以indexOf用来缩短代码:

function getRepeatingNumber(arr){
    for (var i = 1; i < arr.length; i++) {
        if (arr.indexOf(arr[i]) < i) {
            return arr[i];
        }
    }
}
console.log(getRepeatingNumber([2,3,3,6,5,2]));
Run Code Online (Sandbox Code Playgroud)

您甚至可以决定使用find- undefined在没有匹配的情况下将返回(即在我们的情况下没有重复):

function getRepeatingNumber(arr){
    return arr.find((a, i) => {
        if (arr.indexOf(a) < i) {
            return true;
        }
    });
}
console.log(getRepeatingNumber([2,3,3,6,5,2]));
Run Code Online (Sandbox Code Playgroud)

如果对大型阵列执行此操作,那么拥有一个以线性时间复杂度运行的解决方案将变得非常重要.在这种情况下,a Set会很有用:

function getRepeatingNumber(arr){
    var set = new Set;
    return arr.find(a => {
        if (set.has(a)) return true;
        set.add(a);
    });
}
console.log(getRepeatingNumber([2,3,3,6,5,2]));
Run Code Online (Sandbox Code Playgroud)

如果你是函数和单行函数,那么:

const getRepeatingNumber = r=>(t=>r.find(a=>[t.has(a),t.add(a)][0]))(new Set);
console.log(getRepeatingNumber([2,3,3,6,5,2]));
Run Code Online (Sandbox Code Playgroud)