我有以下代码:
alert( [[0,1],[1,0]].indexOf([0,1]) );
即使数组[0,1]是二维数组的一个元素,我得到的值是' -1'回。我在生活中做错了什么?
答案 0 :(得分:5)
它找不到您的元素,因为[0, 1]
和[0, 1]
与4
和4
的方式不同。
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()
使用严格相等(与===或三等号,运算符使用的方法相同)将数组的searchElement
与elements
进行比较)。
您可以使用技巧并序列化您的子阵列和目标项目
它有效,因为[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可能很有用。