对indexOf(array [0])感到困惑

时间:2013-12-02 04:31:28

标签: javascript

这是我前一段时间完成的coderbyte挑战。你的功能应该是我最初使用的第二个最大和第二个最低数字:

function SecondGreatLow(arr){
  var sorted = arr.sort(function(a,b){
  return a-b;
  });
  return sorted[1] + " " + sorted[arr.length - 2];
}
SecondGreatLow(readline());           

我有两个案例错误,其中一个是([2,2,2,5,5,5,6]),因为有重复的数字。我在我的新代码中实现了这个:

function SecondGreatLow(arr) { 
  var exclude = [arr[0]];
  for(var i = 1; i < arr.length; i++) {
    if (exclude.indexOf(arr[i]) == -1) {
      exclude.push(arr[i]);
  }
    }
  return exclude
}
SecondGreatLow([33,33,33,44,44,44,55,55,6,4,3])

我的问题是如何找到所有重复的数字?变量不是排除(arr [0])33吗?我很困惑如何摆脱所有重复的数字。

3 个答案:

答案 0 :(得分:0)

  

我的问题是如何找到所有重复的数字?

它实际上找不到重复值,它会收集唯一值。

您遍历原始数组并仅将exclude中的值添加到exclude中。这可以保证exclude中的每个值都是唯一的。

  

我的问题是如果原来排除只是arr [0]或33

,它是如何做到的

这一行:

var exclude = [arr[0]];

它过去常常没有以空数组开头。正如您在for声明中所看到的那样

for(var i = 1; i < arr.length; i++) {

代码开始在索引1迭代,而不是0。你也可以刚开始使用一个空数组:

var exclude = [];
for(var i = 0; i < arr.length; i++) {

但这有点浪费,因为你知道第一个值无论如何都会被添加到exclude

答案 1 :(得分:0)

此代码的工作方式是将新变量添加到数组排除中。如果当前变量在数组排除中不存在,它将仅添加新变量。 这一行:

exclude.indexOf(arr[i]) == -1

是做主要工作的。 它找到变量i并检查它是否已存在于数组排除中。如果它不存在,indexOf返回-1,因此if语句为true,我们进入行

exclude.push(arr[i]);

并将变量添加到数组exclude中。

答案 2 :(得分:0)

在下面的循环中

for(var i = 1; i < arr.length; i++) {
    if (exclude.indexOf(arr[i]) == -1) {
        exclude.push(arr[i]);
    }
}

正在检查输入数组中的数字是否已经存在于排除中,否则它将插入要排除的数字。

indexOf()方法在数组中搜索指定的项,并返回其位置。因此,如果重复数字,它将不会返回-1,因此上面的逻辑将跳过添加该重复数字以取消变量。您可以参考下面的详细信息。

http://www.w3schools.com/jsref/jsref_indexof_array.asp