2010-07-14 98 views
12

我有兩個包含我創建的對象的JavaScript數組(AB)。我想檢查數組A中的所有對象是否包含在數組B中,但不一定按相同的順序。JavaScript數組 - 檢查兩個對象的相同內容數組,忽略順序

這樣做的最好方法是什麼?

編輯:

他們都是實際的對象,而不是原語,所以我需要他們的內容和結構進行比較,以及(可能使用類似JSON.stringify)。

我想這樣做,因爲我正在學習Test-Driven Development,並且我想測試返回對象列表的函數。我需要測試返回的列表是否具有期望的對象(在這種情況下順序無關緊要)。

+2

它們是諸如'true','false','23'還是實際對象的原語?你也可以解釋你爲什麼要這麼做嗎?可能有更好的方法。 – ChaosPandion 2010-07-14 03:54:14

+0

編輯問題的澄清。 – Chetan 2010-07-14 04:04:27

+0

爲什麼不先排序然後用JSON.stringify比較 – Xinus 2010-07-14 04:07:13

回答

2

用法:isEqArrays(arr1, arr2)

// 
// Array comparsion 
// 

function inArray(array, el) { 
    for (var i = array.length; i--;) { 
    if (array[i] === el) return true; 
    } 
    return false; 
} 

function isEqArrays(arr1, arr2) { 
    if (arr1.length !== arr2.length) { 
    return false; 
    } 
    for (var i = arr1.length; i--;) { 
    if (!inArray(arr2, arr1[i])) { 
     return false; 
    } 
    } 
    return true; 
} 
+0

這比@ ChaosPandion的解決方案快嗎? – Chetan 2010-07-15 01:00:52

+0

它是跨瀏覽器。混沌不是。他使用的語言功能尚未得到很好的支持。 – galambalazs 2010-07-15 10:46:06

+1

此代碼不起作用:'isEqArrays([0,0,1],[0,1,1])'返回'true'。 – callum 2017-08-31 23:28:59

1

這可能是最簡單的方法,如果不是最慢的。

var o = { PropA: 1, PropB: 2 }; 
var a = [1, 2, 3, 4, o]; 
var b = [2, 3, 4, 1]; 

var c = a.filter(function(value, index, obj) { 
    return b.indexOf(value) > -1; 
}); 

if (c.length !== a.length) { 
    throw new Error("Array b is missing some elements!"); 
} 

indexOf只會檢查它們是否指向同一個對象。如果你想檢查價值等同性,你將不得不做深入的比較屬性或使用JSON.stringify正如你在你的問題中提到的。

+0

'.indexOf'也檢查對象是否等同?如果我做了一個'o2 = {PropA:2,PropB:2}'並放在'b'中,它會返回一個非'-1'的東西嗎? – Chetan 2010-07-14 04:19:17

+0

@Chetan - 查看更新。 – ChaosPandion 2010-07-14 04:24:21

+0

與其他答案一樣,這會返回'[0,1,1]'和'[0,0,1]'的誤報。 – callum 2017-08-31 23:32:21

2

如果重複也沒有關係,你可以通過使用lodash使單行。看看兩個數組之間的差異是否爲空。

if (_(array_1).difference(array_2).isEmpty()) { 
    // is equal ignoring order and duplicates 
} 

console.log(_([1,2,3]).difference([2,3,1]).isEmpty()) // -> true 
console.log(_([1,2,3,3]).difference([2,3,1,1]).isEmpty()) // -> also true 
相關問題