2016-12-27 76 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)** –