2015-04-16 48 views
1

正如標題所說,我想比較兩個js數組,其中我只關心內容是相同的,但我不在乎它們的順序是相同的。所以我期望的是這樣的:如何比較javascript數組的內容,但不是它們的順序?

[1, 2, 3, 3] == [1, 2, 3, 3]  // True 
[1, 2, 3, 3] == [1, 3, 2, 3]  // True 
[1, 2, 3, 3] == [1, 2]   // False 
[1, 2, 3, 3] == [1, 2, 3]  // False 
[1, 2, 3, 3] == [1, 2, 3, 3, 3] // False 
[1, 2, 3, 3] == [1, "2, 3, 3"]  // False 

顯然,比較運算符不起作用。從this SO answer我得到了下面的Array.prototype方法,但不幸的是也檢查順序是否相同。

那麼有人知道我可以檢查兩個js數組是否包含相同的元素,而不考慮元素的順序?歡迎所有提示!比較之前

Array.prototype.equals = function (array) { 
    // if the other array is a falsy value, return 
    if (!array) 
     return false; 

    // compare lengths - can save a lot of time 
    if (this.length != array.length) 
     return false; 

    for (var i = 0, l=this.length; i < l; i++) { 
     // Check if we have nested arrays 
     if (this[i] instanceof Array && array[i] instanceof Array) { 
      // recurse into the nested arrays 
      if (!this[i].equals(array[i])) 
       return false;  
     }   
     else if (this[i] != array[i]) { 
      // Warning - two different object instances will never be equal: {x:20} != {x:20} 
      return false; 
     }   
    }  
    return true; 
} 
+0

你只能處理數字的數組或者是你尋找一個通用的解決方案?數組的近似大小是多少?我相信一個最佳的通用解決方案只能通過Map來實現。 –

+0

您可以隨時排序並檢查它們是否相同。 –

+0

另外,這個實現並不是那麼好。由於它使用寬鬆比較,它會返回誤報。例如。 '[[1,2]]'和'['1,2']'被這個算法認爲是相等的。 –

回答

3

排序他們:

從下面的評論,如果你想在2個ARRS含有不同的原始type.add這種功能。

function s(x,y){ 
    var pre = ['string' , 'number' , 'bool'] 
    if(typeof x!== typeof y)return pre.indexOf(typeof y) - pre.indexOf(typeof x); 

    if(x === y)return 0; 
    else return (x > y)?1:-1; 

} 
var arr1 = [1, 2, 3, 3].sort(s); 
var arr2 = [1, 3, 2, 3].sort(s); 

arr1.equals(arr2);// true 
+0

排序並不總是有效。正如我在另一個答案中解釋的那樣,'[1,'1']。sort()'和'['1',1] .sort()'都會以原始順序離開數組。這個例子在你的例子中不是問題,因爲'equals'實現使用寬鬆的比較,但是這本身意味着其他問題(請參閱我對該問題的評論)。事實是,只有在處理相同基元數據類型的值時,排序才能真正起作用。 (鑑於OP提出的問題,可能是這種情況) –

+0

看到我的數組只包含字母串,而沒有別的,上面的Felix Kling的註釋對我來說不是問題。這個解決方案既簡單又有效,現在我已經在使用它了。謝謝@Omar – kramer65

+0

@FelixKling感謝您的notice.solution編輯。 –

1

這是一個針對原始值的解決方案。它使用一個對象作爲原始映射並計算每個值的出現次數。但是,它也會考慮每個值的數據類型。

它檢查數組長度第一,作爲快捷方式:

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

    var seen = {}; 
    a.forEach(function(v) { 
     var key = (typeof v) + v; 
     if (!seen[key]) { 
      seen[key] = 0; 
     } 
     seen[key] += 1; 
    }); 

    return b.every(function(v) { 
     var key = (typeof v) + v; 
     if (seen[key]) { 
      seen[key] -= 1; 
      return true; 
     } 
     // not (anymore) in the map? Wrong count, we can stop here 
    }); 
} 
相關問題