Javascript数组方法找到indexOf过去的第一个值

时间:2015-07-16 06:27:00

标签: javascript arrays indexof

我有一个数组,arr = [0,0,0,0,1,1]。传递给函数的参数包含此数组以及在此示例中恰好为1的数值。我的函数称为pairwise,看起来像这样:

function pairwise(arr, arg) {
  ...some code ...
}
pairwise([0, 0, 0, 0, 1, 1], 1);

如果数组中的元素对加起来传递给函数的第二个参数,那么我需要添加每个唯一对的索引并返回索引的总和。对于这个例子,总和将是10,因为索引0和4加1,索引1和5加1,所以索引0 + 4 + 1 + 5 = 10的总和。我不能计算两次相同的索引。

在我的函数中,我从一个循环遍历数组长度的for循环中的arr [i]中减去arg。然后我从该减法中获取结果并使用arr.indexOf(result)查找索引对(如果存在)。在遇到这个问题之前一切正常。 indexOf只查找第一次出现,当我运行我的代码时,它不计算arr中的第二个1,所以我无法获得第二对。我的总和是4,应该是10.这是我的其余代码:

function pairwise(arr, arg) {
  var array = [];
  if (arr.length != 0) {
    for (var i=0; i<arr.length; i++) {
      if (arr.indexOf(arg - arr[i]) != -1) {
        if (array.indexOf(i) === -1 && array.indexOf(arr.indexOf(arg-arr[i])) === -1) {
          if (i !== arr.indexOf(arg - arr[i])) {
            array.push(i,arr.indexOf(arg - arr[i]));
          }
        }  
      }
    }
  } else {
    return 0;
  }
  console.log (array);
  return array.reduce(function(a,b) {return a+b;});
}

pairwise([0, 0, 0, 0, 1, 1], 1); 

我还将结果推送到数组中,因此我仅限于Array.prototype方法。我试着寻找其他方法,但我找不到任何可以用我正在做的事情来实现的方法。也许您知道一种更简单的方法吗?我的问题是,有没有办法看看indexOf的第一个索引匹配。我应该使用其他方法来解决我的问题吗?

2 个答案:

答案 0 :(得分:2)

我的问题是,有没有办法看一下indexOf的第一个索引匹配。

您可以使用indexOf

的第二个参数fromIndex
  

indexOf()方法返回可在数组中找到给定元素的第一个索引,如果不存在则返回-1。

<强>的fromIndex:

  

开始搜索的索引。如果索引大于或等于数组的长度,则返回-1,这意味着将不搜索该数组。如果提供的索引值为负数,则将其作为数组末尾的偏移量。注意:如果提供的索引为负数,则仍会从前到后搜索数组。如果计算的索引小于0,则将搜索整个数组。默认值:0(搜索整个数组)。

示例:

&#13;
&#13;
var arr = [0, 0, 1, 2, 3];

alert(arr.indexOf(0, arr.indexOf(0) + 1)); // to get the index of second zero
&#13;
&#13;
&#13;

答案 1 :(得分:2)

要获取值的所有索引,可以使用Array.prototype.reduce函数返回匹配的所有索引的数组。

function indexAll(array, match){
    return array.reduce(function(inds,val,i){
        if(val == match) inds.push(i);
        return inds;
    },[]);
}
//  indexAll([0,1,2,3,2,3,2,1,0], 2)   will be [2, 4, 6]
//  indexAll([0,1,2,3,2,3,2,1,0], 4)   will be []
//  indexAll([0,1,2,3,2,3,2,1,0], 0)   will be [0, 8]

但是对于您正在寻找的用途,最好处理一个数组副本,然后删除已经使用过的项目。

function pairwise(arr, arg) {
  var indexSum=0;
  var arrCopy = arr.slice(0);    // copy of array to modify
  var len=arr.length;            // cached for performance
  for (var i = 0; i < len ; i++) {
    if( arrCopy[i] !== undefined){  //only check if index has not been used 
  //  var j =arrCopy.indexOf(arg -arrCopy[i]);
  //  if(j > -1 && i != j){
  //    sumIndex += i + j;  // add the indexes
  //    delete arrCopy[i];  // delete indexes
  //    delete arrCopy[j];
  //  }  
      for(var j = i+1; j < len; j++){
        if (arrCopy[j] !== undefined) {
          if (arrCopy[i]+arrCopy[j] == arg){
            indexSum += i + j;  // add the indexes
            delete arrCopy[j];  // sets arrCopy[j] to undefined to stop reuse
            j = len;         //jump to next i value
          }
        }
      }
    }
  } 
  return indexSum
}

我没有使用indexOf,而是使用了嵌套for循环,因为for循环通常更快。 indexOf实现被注释掉了。见indexOf vs. for loop