2015-10-05 167 views
0

下面是一個包含至少一個其他數組的數組的簡單示例。我想要一種方法來查找數組中的索引。不過,我有下面的代碼不起作用:如何在數組數組中找到元素的索引?

var arr = [1,2,[1,2]]; 
console.log(arr.indexOf([1,2])); //-> -1 

for (var i = 0; i < arr.length; i++) { 
    if (arr[i] == [1,2]) 
    return 'true' // does not return true 
} 

直觀地看,這應該工作,但不會:

if ([1,2] == [1,2]) return 'true' // does not return true 

有人可以解釋爲什麼它不工作,並提供一個替代解決方案?謝謝!

+0

你期望什麼結果?通過**參考**比較JS數組中的 –

+4

。這就是爲什麼'[1,2]!= [1,2]' – hindmost

+3

第一個[1,2]與第二個[[1,2]]不一樣:它們是不同的對象。 – apsillers

回答

0

JavaScript中的數組通過引用而不是按值進行比較。這就是爲什麼

console.log([1,2] == [1,2]) 

返回false

您需要一個可以比較數組的自定義函數。如果您想檢查嵌套您可以使用此代碼的只有第一層:

var compareArrays = function(a, b) { 
    if (a.length !== b.length) { 
     return false; 
    } 

    for (var i = 0, len = a.length; i < len; i++) { 
     if (a[i] !== b[i]) { 
      return false; 
     } 
    } 

    return true; 
} 
1

沒有,但你可以自己去查:

var a = [1,2], b = [1,2]; 

a.length === b.length && a.every(function(x,y) { return x === b[y]; }); 
0

你感到困惑類似對象的定義與相同對象。 Array.prototype.indexOf()使用strict equality comparison algorithm比較對象。對於(許多)對象來說,這意味着對象引用的比較(即對象的唯一標識符,就像它的內存地址一樣)。

在上面的示例中,您試圖將兩個相似的數組視爲同一個數組,這就是爲什麼它不起作用。要做你正在做的事情,你需要使用相同的陣列。就像這樣:

var testArr = [1,2]; //a specific object with a specific reference 
var arr = [1,2,testArr]; //the same array, not a different but similar array 
console.log(arr.indexOf(testArr)); //returns 2 

如果你只是想知道在哪裏發生的陣列父陣列中,使用Array.isArray()

... 
if(Array.isArray(arr[i])) { 
    //do something 
} 
... 

希望幫助!