Hacer un "Diff" en una matriz asociativa en javascript / jQuery?

Si tengo dos matrices asociativas, ¿cuál sería la forma más eficiente de hacer una diferencia con respecto a sus valores?

Por ejemplo, dado:

array1 = { foreground: 'networking', shape: 'circle', background: 'yellow' }; array2 = { foreground: 'networking', shape: 'square', angle: '90', background: 'yellow' }; 

¿Cómo verificaría uno contra el otro, de manera que los elementos faltantes o adicionales sean la matriz resultante? En este caso, si quisiera comparar array1 dentro de array2, devolvería:

 array3 = {shape: 'circle'} 

Mientras que si comparase array2 dentro de array1, devolvería:

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

¡Gracias de antemano por tu ayuda!

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; } 

Si está familiarizado con la syntax de PHP, consulte http://phpjs.org/functions/index que incluye casi todas las funciones relacionadas con arreglos de PHP convertidas en JavaScript, incluyendo array_diff

La solución de RaYell es buena, pero desafortunadamente solo le dirá los elementos en obj2 que son diferentes o inexistentes en obj1, si necesitamos conocer ambos lados, obtengamos todas las keys y luego comparemos. La siguiente function devolverá una matriz asociativa con valores key para cada object. 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 respondió a la pregunta inicial, creo que la solución anterior ofrece otro enfoque que el usuario inicial podría considerar útil para no requerir una revisión dos veces.

Esto podría ser mucho más sofisticado de lo que necesita, pero puede probar mi jsondiffpatch lib que diferirá cualquier par de objects javascript:

https://github.com/benjamine/jsondiffpatch

si desea probarlo, puede verlo en vivo en http://benjamine.github.com/jsondiffpatch/demo/index.html