簡體   English   中英

比較 Arrays

[英]Comparing Arrays

我有一小段代碼,其中一個數組填充了 arrays。 最后,我得到了這個包含n 個成員 arrays 的數組。 這些子數組始終具有相同數量的相同類型(數量)的成員 (2)。 我需要知道這些子數組是否都相同(相同的成員,相同的位置)。 這總是返回 false:

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

在我的腦海中,我可以想到兩種比較方法。

  • 我測試的循環(member[i][0] === member[i+1][0] && member[i][1] === member[i+1][1])。
  • 相同的循環,使用此測試:(member[i].toString() === member[i + 1].toString())。

我認為我采取了錯誤的方式。 你怎么看?

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

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

上面的循環有效,它將返回 false 任何與類型(三個等號 ===)、值、長度甚至鍵不同的元素。

你的第二個建議不應該和第一個一樣工作,因為你已經將它轉換成一個字符串,如果 array1[0] = "true" 和 array2[0] = true 會發生什么? 它將返回 true,因為現在它們都是字符串,但是您需要精確比較對嗎?

這是我自己的想法,希望能有所幫助。

問候,[x]

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

也許不是最有效的,但它似乎有效,而且我強烈支持更短、更易讀的解決方案。

請注意,xx3004 關於轉換為字符串時丟失類型數據的觀點是需要考慮的,除非您確定您的 arrays 將由相同的數據類型組成。

您可以使用以下內容來判斷兩個一維 arrays 是否相同。 如果您添加維度,它需要是遞歸的,但我認為這足以滿足您的要求。

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/

這就是我想出的...

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;

}

這是一個比較兩個 arrays 的簡單方法,基於您的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

如果你願意使用Underscore ,這是一個很棒的工具(我認為它與 jQuery 一樣甚至更高),你可以大大簡化這段代碼。 在比較 arrays 時不需要嵌套:我會事先將它們展平。 然后它只是一個循環:

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;
}

將其概括為與任意數量的 arrays 一起工作也應該非常簡單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM