2016-12-27 5 views
0

私は最後の時間を過ごし、半分は私が最終的にこのJavaScriptコードことに気づいたとき、私のコードのバグを発見しようとしている:なぜ["[1,2]、[3、4]]。indexOf([1,2])"は-1を返しますか?

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

戻り-1、正しく0を返すにもかかわらず、何かなど[1, 2, 3].indexOf(1);として...

なぜこのようなことが起こり、サブアレイの正しいインデックスを見つけることができますか?

+4

[2、1] 'ので!== [1、2]'。 – Cristy

+0

ここで、配列を比較する他の方法を見つけることができます:http://stackoverflow.com/questions/7837456/how-to-compare-arrays-in-javascript – sinisake

答えて

2

indexOfは、プリミティブの引数を取り、あなたが一致することはできません。明らかにfalseを与える

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

を。

+0

'indexOf'は' ==の代わりに '===' '。今、なぜ[[42、NaN] .indexOf(NaN) 'が' -1'を返すのかをOPに説明しようとします。 :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

または** JSON.stringify(a)の代わりに** a.join( "")**を使用できます** –

関連する問題