2011-06-05 125 views
1

我有一小段代碼,其中數組填充數組。最後,我有這個陣列n成員數組。這些子數組總是具有相同數量的相同類型(數字)的成員(2)。我需要知道這些子數組是否完全相同(相同的成員,相同的位置)。這總是返回false:比較數組

[2, 0] === [2, 0] 

關閉我的頭頂,我可以想到兩種方法來比較。

  • 循環,其中我測試(部件[I] [0] ===構件第[i + 1] [0] & &構件[I] [1] ===構件第[i + 1] [1])。
  • 與此測試相同的循環:(member [i] .toString()=== member [i + 1] .toString())。

我想我正在採取這種錯誤的方式。你怎麼看?

回答

2

對於我自己的想法,我認爲使用循環來比較兩個數組是正確的。

var isTheSame = true; 
for (var i in array1) { 
    if (array1[i] !== array2[i]) isTheSame = false; 
} 

上述工作循環,它將返回虛假或者任何從不同類型的元件(3等號===),或值,或長度或偶數密鑰的。

你的第二個建議不應該像第一個那樣完全一樣,因爲你已經把它轉換成一個字符串了,如果array1 [0] =「true」和array2 [0] = true會發生什麼?它會返回true,因爲現在它們都是字符串,但是您需要準確的比較嗎?

這是我自己的想法,我希望它可以幫助某種方式。

問候, [X]

+1

+1你的觀點關於「true」== true在toString()是好的之後 – 2011-06-05 05:45:32

+1

是的,那是關於我現在所擁有的,它的工作原理。我想知道是否有另一種方式。謝謝! :) – 2011-06-05 06:15:02

2
a=[2,0]; b=[2,0]; a.toString() == b.toString(); 

也許不是最有效的,但它似乎工作,我更短,更具可讀性的解決方案的堅定支持者。

請注意,xx3004關於轉換爲字符串時丟失的類型數據的觀點是值得思考的,除非您確實知道您的數組將由相同的數據類型組成。

+0

我甚至沒有注意到你已經在你的問題中發佈了這個解決方案直到現在:^( – 2011-06-05 05:43:47

+0

+1:同樣如果它的int和用逗號分隔'array1.join()=== array2.join( );' – naveen 2011-06-05 05:47:49

+0

Ooooh,_join_,我要玩那個。 – 2011-06-05 06:14:22

1

對於兩個一維數組是否完全相同,可以使用下面的說法得到真或假。它需要遞歸,如果你添加尺寸,但這就足夠了你所問的,我想。

function testArray(a, b) { 
    var aLen = a.length; 
    var bLen = b.length; 

    if (aLen === bLen) { // check for identical length first 
     for (var i = 0; i < aLen; i++) { 
      if (a[i] !== b[i]) { 
       return false; // members don't match 
      } 
     } 
     return true; // all members matched 
    } 
    return false; // not same length 
} 

http://jsfiddle.net/pgkUr/

+1

+1偉大的思想? :P – alex 2011-06-05 05:46:41

1

這是我想出了...

var arrayCompare = function(a, b) { 

    var aLength = a.length, 
     bLength = b.length; 

    if (aLength != bLength) { 
     return false; 
    } 

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

    return true; 

} 
+0

這看起來很熟悉。 ;) – brymck 2011-06-05 05:47:30

+0

要玩那個,謝謝! :) – 2011-06-05 06:17:08

1

這裏有一個簡單的方法來兩個數組比較,建立在你的toString想法(甚至多維的人將工作):

function compareArrays(a1, a2) { 
    return JSON.stringify(a1) == JSON.stringify(a2); 
} 

compareArrays([[2,3],[7,4],[3,3]], [[2,3],[7,4],[3,3]]) // true 
compareArrays([[2,3],[7,4],[3,3]], [[7,4],[2,3],[3,3]]) // false 
0

如果您願意使用Underscore,這是一個很棒的工具(我認爲它比jQuery好,甚至更高),你可以簡化這些代碼。在比較數組時,你不需要嵌套:我會事先把它們弄平。然後,它只是一個循環:

function cmpArrays(arr1, arr2){ 
    var flat = _.zip(_.flatten(arr1), _.flatten(arr2)); 

    for(var elem in flat){ 
     if(flat[elem][0] !== flat[elem][1]){ 
      return false; 
     } 
    } 

    return true; 
} 

推廣這一與任意數量的陣列的工作應該是很簡單的爲好。