【问题标题】:Javascript array method to find indexOf past the first valueJavascript数组方法查找第一个值之后的indexOf
【发布时间】:2015-07-16 06:26:59
【问题描述】:

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

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 的第一个索引匹配。我应该使用其他方法来解决我的解决方案吗?

【问题讨论】:

    标签: javascript arrays indexof


    【解决方案1】:

    要获取一个值的所有索引,您可以使用 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

    【讨论】:

      【解决方案2】:

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

      可以使用indexOf的第二个参数fromIndex

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

      来自索引:

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

      例子:

      var arr = [0, 0, 1, 2, 3];
      
      alert(arr.indexOf(0, arr.indexOf(0) + 1)); // to get the index of second zero

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多