为什么“[[1, 2], [3, 4]].indexOf([1, 2])” return -1?
Why does "[[1, 2], [3, 4]].indexOf([1, 2])" return -1?
我花了最后一个半小时试图在我的代码中找到错误,当我终于意识到这个 JavaScript 代码时:
[[1, 2], [3, 4]].indexOf([1, 2]);
returns -1
,即使 [1, 2, 3].indexOf(1);
之类的东西正确 returns 0...
为什么会这样,我怎样才能找到子数组的正确索引?
indexOf
仅接受原始参数,您无法匹配:
[1, 2] == [1, 2]
这显然给出了 false
。
您可以迭代数组并检查模式的每个项目和 return 索引。
function getIndexOf(array, pattern) {
var index = -1;
array.some(function (a, i) {
if (a.length !== pattern.length) {
return false;
}
if (a.every(function (b, j) { return b === pattern[j]; })) {
index = i;
return true;
}
});
return index;
}
console.log(getIndexOf([[1, 2], [3, 4], [7, 8]], [7, 8]));
JSON 和 indexOf
的另一种方式。
function getIndexOf(array, pattern) {
return array.map(function (a) { return JSON.stringify(a); }).indexOf(JSON.stringify(pattern));
}
console.log(getIndexOf([[1, 2], [3, 4], [7, 8]], [7, 8]));
我花了最后一个半小时试图在我的代码中找到错误,当我终于意识到这个 JavaScript 代码时:
[[1, 2], [3, 4]].indexOf([1, 2]);
returns -1
,即使 [1, 2, 3].indexOf(1);
之类的东西正确 returns 0...
为什么会这样,我怎样才能找到子数组的正确索引?
indexOf
仅接受原始参数,您无法匹配:
[1, 2] == [1, 2]
这显然给出了 false
。
您可以迭代数组并检查模式的每个项目和 return 索引。
function getIndexOf(array, pattern) {
var index = -1;
array.some(function (a, i) {
if (a.length !== pattern.length) {
return false;
}
if (a.every(function (b, j) { return b === pattern[j]; })) {
index = i;
return true;
}
});
return index;
}
console.log(getIndexOf([[1, 2], [3, 4], [7, 8]], [7, 8]));
JSON 和 indexOf
的另一种方式。
function getIndexOf(array, pattern) {
return array.map(function (a) { return JSON.stringify(a); }).indexOf(JSON.stringify(pattern));
}
console.log(getIndexOf([[1, 2], [3, 4], [7, 8]], [7, 8]));