为什么二维数组的索引返回-1

时间:2015-12-09 04:09:21

标签: javascript

我有以下代码:

alert( [[0,1],[1,0]].indexOf([0,1]) );

即使数组[0,1]是二维数组的一个元素,我得到的值是' -1'回。我在生活中做错了什么?

2 个答案:

答案 0 :(得分:5)

它找不到您的元素,因为[0, 1][0, 1]44的方式不同。

console.log(4 === 4); // true
console.log([0, 1] === [0, 1]); // false

当您对类型为object的内容进行相等检查时,Javascript会使用reference equality之类的内容。它检查这两个对象是否实际上是相同的实例

var a = [0, 1];
var b = [1, 0];
var arr = [a, b];

console.log(arr.indexOf(a)); // 0
console.log(a === arr[0]); // true

或者,您可以使用deep equality check编写自己的搜索功能。

function deepSearch(arr, element) {
  for(var index = 0; index < arr.length; index++) {
    if(deepEqual(arr[index], element)) {
      return index;
    }
  }

  return -1;
}

答案 1 :(得分:2)

简短回答:因为 [0,1] === [0,1] false

根据.indexOf文档,

  

indexOf()使用严格相等(与===或三等号,运算符使用的方法相同)将数组的searchElementelements进行比较)。

您可以使用技巧并序列化您的子阵列和目标项目 它有效,因为[0,1] !== [0,1],但是"[0,1]" === "[0,1]"

Array.prototype.indexOfForArrays = function(search)
{
  var searchJson = JSON.stringify(search); // "[0,1]"
  var arrJson = this.map(JSON.stringify); // ["[3,4]", "[0,1]", "[1,0]"]

  return arrJson.indexOf(searchJson);
};

document.body.innerText = [[3,4], [0,1], [1,0]].indexOfForArrays([0,1]); 

还有其他一些方法。这个Stackoverflow question可能很有用。