javascript indexOf() 不断返回 -1

javascript indexOf() keeps returning -1

我有一个这样的数组

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

我是运行很简单的一行indexOf()。但是,尽管数组中确实存在我使用的测试值,但我一直得到 -1。

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

我是不是哪里弄错了?

您可以使用 #findIndex() and #every()outer 数组中找到 inner 数组的索引 - 请参见下面的演示:

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);

如@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]));

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);