2010-07-14 15 views
12

Ho due array JavaScript (A e B) che contengono oggetti che ho creato. Voglio verificare che tutti gli oggetti nell'array A siano contenuti nell'array B, ma non necessariamente nello stesso ordine.Array Javascript - Controllo di due matrici di oggetti per stessi contenuti, ignorando l'ordine

Qual è il modo migliore per farlo?

Edit:

Sono tutti oggetti reali, non primitive, quindi ho bisogno di confrontare così il loro contenuto e la struttura (magari usando qualcosa come JSON.stringify).

Voglio farlo perché sto imparando lo sviluppo basato su test e voglio testare le funzioni che restituiscono elenchi di oggetti. Devo verificare se le liste restituite contengono o meno gli oggetti previsti (l'ordine non è rilevante in questo caso).

+2

Sono primitive come 'true',' false', '23' o oggetti reali? Puoi anche spiegare perché vuoi farlo? Potrebbe esserci un modo migliore. – ChaosPandion

+0

Domanda modificata per chiarimenti. – Chetan

+0

Perché non ordinare prima e quindi utilizzare JSON.stringify per confrontare – Xinus

risposta

2

Usage: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

È più veloce della soluzione di @ ChaosPandion? – Chetan

+0

è cross browser. Il caos non lo è. Usa caratteristiche linguistiche che non sono ancora ben supportate. – galambalazs

+1

Questo codice non funziona: 'isEqArrays ([0, 0, 1], [0, 1, 1])' restituisce 'true'. – callum

1

Questo è probabilmente il metodo più semplice se non il più lento.

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 verificherà soltanto che si riferiscono allo stesso oggetto. Se si desidera verificare l'equivalenza di valore, è necessario effettuare un confronto approfondito delle proprietà o utilizzare JSON.stringify come si menziona nella domanda.

+0

Esiste anche il controllo '.indexOf' per l'equivalenza dell'oggetto? Come in, se creo un 'o2 = {PropA: 2, PropB: 2}' e lo metto in 'b', restituirebbe qualcosa di diverso da' -1'? – Chetan

+0

@Chetan - Vedi aggiornamento. – ChaosPandion

+0

Come per l'altra risposta, restituisce un falso positivo per '[0, 1, 1]' e '[0, 0, 1]'. – callum

2

Se i duplicati anche non contano, è possibile effettuare battute utilizzando lodash. Guarda se la differenza tra due array è vuota.

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 
Problemi correlati