2010-12-16 59 views
45

Duplicar posible:
Object comparison in JavaScriptComparar 2 JSON objetos

¿Hay algún método que toma en 2 objetos JSON y compara el 2 para ver si los datos han cambiado?

Editar

Después de revisar los comentarios, se necesita alguna aclaración.

  1. objeto

    A JSON se define como

    "un conjunto desordenado de pares de nombre/valor. Un objeto comienza con {(llave izquierda) y termina con} (llave derecha). Cada el nombre va seguido de: (dos puntos) y los pares de nombre/valor están separados por, (coma). " - json.org

  2. Mi objetivo es ser capaz de comparar 2 literales de objetos JSON, simplemente ponga.

no soy un gurú de Javascript por lo que si, en javascript, estos son objetos literales, entonces supongo que es lo que debería llamarlos.

creo lo que estoy buscando es un método capaz de:

  1. recursividad profunda para encontrar un único par nombre/valor
  2. Determinar la longitud de ambos objetos literales, y comparar el nombre/valor pares para ver si existe una discrepancia en cualquiera de ellos.
+2

No hay nada como un objeto JSON. Ya sea una cadena JSON o un objeto JavaScript, pero no una combinación de ninguno de estos (vale, tal vez exista una cadena de JavaScript;)). –

+0

@ mjw06d ¿Desea comparar las cadenas que son JSON para objetos o desea comparar dos instancias de 'Objeto' JavaScript existentes? – Phrogz

+4

@Felix Kling, tienes razón, pero conversacionalmente, un "objeto JSON" para mí significa que en Java se llama POJO ... un objeto simple que contiene solo (una jerarquía de) primitivas, en oposición a un Objeto con un constructor, funciones privadas o públicas, etc. No es técnicamente correcto, pero ayuda a comprender la pregunta. –

Respuesta

16

Basta con analizar el JSON y la comparación de los dos objetos no es suficiente porque no sería exactamente las mismas referencias a objetos (pero podrían ser los mismos valores).

Tienes que hacer una profunda igualdad.

De http://threebit.net/mail-archive/rails-spinoffs/msg06156.html - que parece el uso jQuery.

Object.extend(Object, { 
    deepEquals: function(o1, o2) { 
    var k1 = Object.keys(o1).sort(); 
    var k2 = Object.keys(o2).sort(); 
    if (k1.length != k2.length) return false; 
    return k1.zip(k2, function(keyPair) { 
     if(typeof o1[keyPair[0]] == typeof o2[keyPair[1]] == "object"){ 
     return deepEquals(o1[keyPair[0]], o2[keyPair[1]]) 
     } else { 
     return o1[keyPair[0]] == o2[keyPair[1]]; 
     } 
    }).all(); 
    } 
}); 

Usage: 

var anObj = JSON.parse(jsonString1); 
var anotherObj= JSON.parse(jsonString2); 

if (Object.deepEquals(anObj, anotherObj)) 
    ... 
+0

Corrígeme si estoy equivocado, pero estoy bastante seguro de que este no es un método recursivo profundo. Me parece que solo funcionaría para 1 nivel. –

+0

Se actualizó la función para trabajar con objetos anidados. –

+0

Creo que la línea siguiente está rota: 'if (typeof o1 [..] == typeof o2 [..] ==" object ")' ... porque la primera comparación devolverá un valor booleano. –