2009-07-10 21 views
8

He buscado aquí un método de calidad para comparar matrices asociativas en JavaScript. La única solución decente que he encontrado es el proyecto PHP.JS que tiene algunas funciones de matriz comparativa. El único problema es que estas funciones consideran la primera matriz como la clave de la segunda. En mi situación, al menos, ambas matrices no siempre tienen el mismo número de claves ni las mismas claves. Esto hace que las funciones muestren resultados que no incluyen claves que pueden no haber existido en array1 pero que existían en array2. Lo único que se me ocurre hasta ahora es ejecutar la función array_diff_associative() dos veces con los argumentos invertidos y luego combinarlos (lo que parece problemático ya que el primer argumento se usa nuevamente como las teclas del segundo).Comparar dos matrices Javascript - Asociativo

¿Alguna sugerencia? Gracias.

Respuesta

7

Creo que el siguiente debe hacer lo que quiera:

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

preguntándome, ¿no sería su primera comparación en comparaciónArrays asociativos si (a === b)? –

+0

err sí probablemente :-) –

+0

Su solución tiene dos inconvenientes: (1) incorrectamente devolvería verdadero en el caso cuando a y b tienen los mismos tamaños, y a tiene una clave que apunta a un valor indefinido, mientras que b doesn ' t tiene esa clave. (2) incorrectamente devolvería falso en el caso en que existan dos valores dentro de a y b, que tengan los mismos valores, pero que en realidad sean objetos y que no sean iguales con un operador '=='. Si bien es fácil de arreglar (1), requeriría más esfuerzo repararlo (2). Como solución alternativa, usaría simplemente un método ** toString() **, o incluso más rápido, ** join ('') ** para comparar dos cadenas. – CuongHuyTo

2

Realmente no sé si hay una manera mejor de hacerlo que el método de fuerza 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; 
} 

también , son objetos, no matrices, y algunas propiedades no se podrán enumerar a través de for ... in (como Array.length, por ejemplo), así que téngalo en cuenta para su aplicación.

8

Esta es una vieja pregunta, pero ya que aparece primero en una búsqueda de Google para comparar matrices, pensé que lanzaría una solución alternativa que funciona incluso cuando la matriz tiene dos objetos diferentes con los mismos valores.

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

Nota: Esto depende del pedido, por lo que si el pedido no importa, siempre puede hacer un tipo de antemano.

Cuestiones relacionadas