javascript indexOf()继续返回-1

时间:2017-08-20 05:16:16

标签: javascript arrays indexof

我有一个像这样的数组

var a = [[1, 0], [3, 0], [5, 0], [7, 0]];

我正在运行一个非常简单的indexOf()行。但是,尽管我使用的测试值确实存在于数组中,但我仍然保持-1。

var i = a.indexOf([1, 0]);
console.log("INDEX: ", i);

我在某处犯了错误吗?

3 个答案:

答案 0 :(得分:2)

您可以使用#findIndex()#every()查找外部数组中内部数组的索引 - 请参阅下面的演示:

var a = [[1, 0], [3, 0], [5, 0], [7, 0]];
var search = [1,0]; // array to get index of from the 'a'

var i = a.findIndex(function(n) {
  return search.every(function(p,q) { 
    return p === n[q]
  });
});
console.log("INDEX: ", i);

更简单的 ES6 风味:

var a = [[1, 0], [3, 0], [5, 0], [7, 0]];
var search = [1, 0]; // array to get index of from the 'a'

var i = a.findIndex(n => search.every((p, q) => p === n[q]));
console.log("INDEX: ", i);

答案 1 :(得分:1)

正如@Nisarg所提到的,当你使用数组传递indexOf时,它会检查引用而不是值。所以为了获得正确的indexOf,你应该为每个数组手动循环。

var a = [[1, 0], [3, 0], [5, 0], [7, 0]];

function arrayIndexOf(arr){
  for(var x=0;x<a.length;x++){
    if(arr[0]===a[x][0]&&arr[1]===a[x][1]){
      return x
    }
  }
}

console.log(arrayIndexOf([1,0]));

答案 2 :(得分:1)

indexOf函数不会按值比较数组。因此,为了能够比较两个数组,您需要一个函数。在这种情况下,我使用了@TomášZato创建的here函数。

完成后,您可以迭代源数组并获取匹配数组的索引。

// Warn if overriding existing method
if(Array.prototype.equals)
    console.warn("Overriding existing Array.prototype.equals. Possible causes: New API defines the method, there's a framework conflict or you've got double inclusions in your code.");
// attach the .equals method to Array's prototype to call it on any array
Array.prototype.equals = function (array) {
    // if the other array is a falsy value, return
    if (!array)
        return false;

    // compare lengths - can save a lot of time 
    if (this.length != array.length)
        return false;

    for (var i = 0, l=this.length; i < l; i++) {
        // Check if we have nested arrays
        if (this[i] instanceof Array && array[i] instanceof Array) {
            // recurse into the nested arrays
            if (!this[i].equals(array[i]))
                return false;       
        }           
        else if (this[i] != array[i]) { 
            // Warning - two different object instances will never be equal: {x:20} != {x:20}
            return false;   
        }           
    }       
    return true;
}
// Hide method from for-in loops
Object.defineProperty(Array.prototype, "equals", {enumerable: false});

var a = [[1, 0], [3, 0], [5, 0], [7, 0]];
var index = -1;
for(var i = 0; i < a.length; i++) {
  if(a[i].equals([1,0])) {
    index = i;
  }
}

console.log(index);