2009-07-10 16 views
8

Ho cercato qui un metodo di qualità per confrontare gli array associativi in ​​javascript. L'unica soluzione decente che ho trovato è il progetto PHP.JS che ha alcune funzioni di array comparativo. L'unico problema è che queste funzioni considerano il primo array come la chiave del secondo. Nella mia situazione almeno entrambi gli array non hanno sempre lo stesso numero di chiavi e le stesse chiavi. Ciò fa sì che le funzioni restituiscano risultati che non includono chiavi che potrebbero non essere esistite in array1 ma che esistevano in array2. L'unica cosa che posso pensare finora è di eseguire la funzione array_diff_associative() due volte con gli argomenti capovolti e combinarli (il che sembra problematico dal momento che il primo argomento è usato come chiave per il secondo).Confronta due array Javascript - Associative

Qualche suggerimento? Grazie.

risposta

7

Credo che il seguente dovrebbe fare quello che vuoi:

function nrKeys(a) { 
    var i = 0; 
    for (key in a) { 
     i++; 
    } 
    return i; 
} 
function compareAssociativeArrays(a, b) { 
    if (a == b) { 
     return true; 
    } 
    if (nrKeys(a) != nrKeys(b)) { 
     return false; 
    } 
    for (key in a) {  
    if (a[key] != b[key]) { 
     return false; 
    } 
    } 
    return true; 
} 
+1

semplicemente chiedendo, non dovrebbe il tuo primo paragone in ParallelametriAssociative essere (a === b)? –

+0

err sì probabilmente :-) –

+0

La tua soluzione ha due svantaggi: (1) restituirebbe correttamente in modo errato nel caso in cui aeb hanno le stesse dimensioni, e ha una chiave che punta a un valore indefinito, mentre b non lo fa Ho quella chiave. (2) restituirebbe erroneamente false nel caso in cui esistano due valori all'interno di aeb, che hanno gli stessi valori, ma sono in realtà oggetti e non sono uguali da un operatore '=='. Mentre è facile da risolvere (1), richiederebbe più sforzo per risolvere (2). Come soluzione alternativa, userei solo un metodo ** toString() **, o anche più veloce, ** join ('') ** per confrontare due stringhe. – CuongHuyTo

2

io davvero non so se c'è un modo migliore per farlo che l'approccio forza bruta:

function differences(a, b){ 
    var dif = {}; 
    for(key in a){ //In a and not in b 
    if(!b[key]){ 
     dif[key] = a[key]; 
    } 
    } 
    for(key in a){ //in a and b but different values 
    if(a[key] && b[key] && a[key]!=b[key]){ 
     //I don't know what you want in this case... 
    } 
    } 
    for(key in b){ //in b and not in a 
    if(!a[key]){ 
     dif[key] = b[key]; 
    } 
    } 
    return dif; 
} 

anche , sono oggetti, non array e alcune proprietà non saranno enumerabili attraverso for..in (come Array.length, ad esempio), quindi prendilo in considerazione per la tua applicazione.

8

Questa è una vecchia domanda, ma poiché si trova prima in una ricerca su google per confrontare gli array, ho pensato di inserire una soluzione alternativa che funzioni anche quando l'array ha due oggetti diversi con gli stessi valori.

function arrays_equal(a, b) { 
    return JSON.stringify(a) == JSON.stringify(b); 
} 

Nota: Questa è ordine dipendente, quindi se l'ordine non importa, sempre si può fare una sorta prima del tempo.