2016-12-27 247 views
0

我花了近一个半小时,试图找到我的代码中的错误,当我终于意识到,这段JavaScript代码:为什么“[[1,2],[3,4]]。indexOf([1,2])”返回-1?

[[1, 2], [3, 4]].indexOf([1, 2]); 

回报-1,即使一些诸如[1, 2, 3].indexOf(1);正确返回0 ...

为什么会发生这种情况,以及如何找到子数组的正确索引?

+4

因为'[1,2]!== [1,2]'。 – Cristy

+0

在这里你可以找到更多的方法来比较数组:http://stackoverflow.com/questions/7837456/how-to-compare-arrays-in-javascript – sinisake

回答

2

indexOf只需要原始参数,你无法比拟的:

[1, 2] == [1, 2] 

这显然给了false

+0

'indexOf'做一个'==='而不是'== '。现在尝试向OP解释为什么'[42,NaN] .indexOf(NaN)'返回'-1'。 :D –

+0

@IonicăBizău'NaN == NaN'和'NaN === NaN'都返回'false'。 'NaN'不是原始类型。 –

+0

@IonicăBizău - “indexOf做一个===而不是==” - 这在这里没有什么不同。 – Quentin

1

您可以迭代数组并检查模式的每个项目并返回索引。

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

+0

或者可以使用** a.join(“”)**而不是** JSON.stringify(a)** –