web-dev-qa-db-fra.com

Comparer 2 objets JSON

Duplicata possible:
Comparaison d'objets en JavaScript

Existe-t-il une méthode qui prend 2 objets JSON et compare les 2 pour voir si des données ont changé?

Modifier

Après avoir examiné les commentaires, des éclaircissements sont nécessaires.

  1. Un objet JSON est défini comme

    "un ensemble non ordonné de paires nom/valeur. Un objet commence par {(accolade gauche) et se termine par} (accolade droite). Chaque nom est suivi de: (deux points) et les paires nom/valeur sont séparées par, (virgule) . " - json.org

  2. Mon objectif est de pouvoir comparer 2 littéraux d'objets JSON, tout simplement.

Je ne suis pas un gourou javascript donc si, en javascript, ce sont des littéraux d'objets, alors je suppose que c'est comme ça que je devrais les appeler.

Je crois que ce que je recherche, c'est une méthode capable de:

  1. Récursivité profonde pour trouver une paire nom/valeur unique
  2. Déterminez la longueur des deux littéraux d'objet et comparez les paires nom/valeur pour voir s'il existe une différence dans l'un ou l'autre.
47
user356808

Il ne suffit pas d'analyser le JSON et de comparer les deux objets, car il ne s'agirait pas exactement des mêmes références d'objet (mais il pourrait s'agir des mêmes valeurs).

Vous devez faire un profond égal.

De http://threebit.net/mail-archive/Rails-spinoffs/msg06156.html - qui semble utiliser 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))
   ...
14
jd.