2010-04-01 20 views
6

Si tengo dos matrices asociativas, ¿cuál sería la forma más eficiente de hacer una diferencia con respecto a sus valores?Hacer un "Diff" en una matriz asociativa en javascript/jQuery?

Por ejemplo, dado:

array1 = { 
    foreground: 'red', 
    shape: 'circle', 
    background: 'yellow' 
    }; 

    array2 = { 
    foreground: 'red', 
    shape: 'square', 
    angle: '90', 
    background: 'yellow' 
    }; 

¿Cómo puedo comprobar la una contra la otra, de tal manera que los elementos que faltan oadicional son la matriz resultante. En este caso, si quería comparar array1 dentro matriz2, devolvería:

array3 = {shape: 'circle'} 

mientras que si he comparado matriz2 dentro array1, devolvería:

array3 = {shape: 'square', angle: '90'} 

Gracias de antemano por su ayuda!

Respuesta

7

Prueba esto:

function diff(obj1, obj2) { 
    var result = {}; 
    $.each(obj1, function (key, value) { 
     if (!obj2.hasOwnProperty(key) || obj2[key] !== obj1[key]) { 
      result[key] = value; 
     } 
    }); 

    return result; 
} 
3

Si está familiarizado con la sintaxis de PHP, echar un vistazo a http://phpjs.org/functions/index que incluye casi todas las funciones relacionadas con la matriz de PHP convertidas en JavaScript – incluyendo array_diff

1

solución de RaYell es agradable pero desafortunadamente solo le dirá los elementos en obj2 que son diferentes o inexistentes en obj1, si necesitamos conocer ambos lados, obtengamos todas las claves y luego comparemos. La siguiente función devolverá una matriz asociativa con valores clave para cada objeto. Oh ... para ser justo, aún no lo he probado, pero debería funcionar.

var diff = function(obj1,obj2) { 
    var newObj = $.extend({},obj1,obj2); 
    var result = {}; 
    $.each(newObj, function (key, value) { 
     if (!obj2.hasOwnProperty(key) || !obj1.hasOwnProperty(key) || obj2[key] !== obj1[key]) { 
     result[key] = [obj1[key],obj2[key]]; 
     } 
    }); 

    return result; 
} 

Ah, y si bien reconozco que la primera solución responde a la pregunta inicial, creo que la solución anterior ofrece otro enfoque que el usuario inicial pueda ser útil a fin de no requerir la comprobación dos veces.

Cuestiones relacionadas