2012-04-27 8 views
13

Decir que tengo los siguientes 2 objetos JSON:Javascript JSON comparison/diff?

JSON A: 
{ 
"Field A":"1", 
"Field B":"2", 
"Field D":"Something", 
"Field E":"6" 
} 

JSON B: 
{ 
"Field A":"1", 
"Field B":"2", 
"Field C":"3", 
"Field D":"Different" 
} 

Función de ejemplo: función (jsonstringA, jsonstringB)

Ejemplo (Si JSON A y JSON B utilizan como parámetros):

devoluciones un nuevo objeto JSON que contiene:

{ 
"Field C":"3", // because function sees jsonstringB had no "Field C" 
"Field D": "Different" // sees jsonstringB had a different value for "Field D" 
} 

Tenga en cuenta que está utilizando jsonstringA como base de la comparación ison, por lo que la función devuelve solo los campos que faltan y los valores de jsonStringB. Es por eso que el "Campo E" y su valor no se devuelve.

¿Cuál es, de ser posible, la mejor manera de encontrar una función que devuelva un objeto json que contenga valores que hayan cambiado?

lo que he intentado: he intentado hacer una comparación especificando manualmente los campos que estoy tratando de comprobar si, pero me gustaría tener algo que me obliga a no codificar el "campos", ya que muy es ineficaz y cada vez que agrego un nuevo campo a JSON B, tengo que codificar en el campo que estoy buscando ... es por eso que estoy buscando algo menos de un dolor.

+1

http://tlrobinson.net/projects/javascript-fun/jsondiff/ – Phrogz

+0

Puede basar algo en el código de esta respuesta: http://stackoverflow.com/a/1144249/562906 – sinelaw

Respuesta

11

No es demasiado difícil crear una función como esta. Simplemente recorra cada campo en el segundo objeto, y si no está presente en el primero o si el valor es diferente al primero, ponga ese campo en el objeto de retorno.

var compareJSON = function(obj1, obj2) { 
    var ret = {}; 
    for(var i in obj2) { 
    if(!obj1.hasOwnProperty(i) || obj2[i] !== obj1[i]) { 
     ret[i] = obj2[i]; 
    } 
    } 
    return ret; 
}; 

Se puede ver en acción en this demo page.

+0

Ah, ignora mi comentario, supuse que también quería una diferencia para el número variable de propiedades para los objetos a y b. Pero parece que ambos objetos tienen el mismo número de propiedades. –

+2

Es probable que el OP quiera recurrir en los valores de objeto y matriz. – Phrogz

+0

@Phrogz No estoy seguro, de su descripción y ejemplo parece suficiente una comparación superficial. –

3

Usted puede echar un vistazo a JSON diff envoltorio here

También ha page.You demostración puede utilizar este envoltorio.

2

La función, justo lo que estaba después también es útil para no - JSON comparación de objetos

http://jsfiddle.net/muJEu/11/

también se extendieron para objetos anidados profundas.

isEmpty 

se puede hacer de muchas maneras. ver Is object empty?

var compareObj = function(obj1, obj2) { 
    var ret = {},rett; 
    for(var i in obj2) { 
     rett = {}; 
     if (typeof obj2[i] === 'object'){ 
      rett = compareObj (obj1[i], obj2[i]) ; 
      if (!isEmpty(rett)){ 
      ret[i]= rett 
      }    
     }else{ 
      if(!obj1 || !obj1.hasOwnProperty(i) || obj2[i] !== obj1[i]) { 
       ret[i] = obj2[i]; 
     } 
    } 
    } 
    return ret; 
}; 
+0

Esto falla si un valor es una matriz, porque 'typeof [] === 'object'' – SimplGy

+1

Esto no funciona como se espera si existe una propiedad en' obj1' pero no en 'obj2'. por ejemplo: 'a = {a: true}' 'b = {b: true}'. 'compareObj (a, b) // devuelve {b: true}. usted podría esperar {a: true, b: true} ' – SimplGy

+0

¿Dónde se define' rett', o es una variable global? – Jocie