2 votes

Comparer deux objets JSON et renvoyer simplement un autre objet JSON avec seulement les changements

Je suis nouveau en JavaScript et j'essaie de trouver la différence entre deux objets JSON. La structure de l'objet JSON et ses données sont affichées ci-dessous. J'ai trouvé un code en ligne qui fonctionne pour un objet JSON normal mais comme celui-ci contient également un tableau de données, je pense que ça ne fonctionne pas pour ça. J'ai essayé différentes choses mais sans résultat. Si vous avez des conseils à ce sujet, ce serait grandement apprécié. Merci.

Objet JSON 1 (obj1) : {id: 1, details: Array[2], profession: "Business"}

{
  "id": "1",
  "details": [{
      "name": "Peter",
      "address": "Arizona",
      "phone": 9900998899
    },
    {
      "name": "Jam",
      "address": "Kentucky",
      "phone": 56034033343
    }
  ],
  "profession": "Business"
}

Objet JSON 2 (obj2) : {id: 2, details: Array[2], profession: "Business"}

{
  "id": "2",
  "details": [{
      "name": "Peter",
      "address": "Arizona",
      "phone": 9900998899
    },
    {
      "name": "David",
      "address": "Boston",
      "phone": 434323434
    }
  ],
  "profession": "Business"
}

Solution:

compare(obj1, obj2) {

  var result = {};

  for (key in obj1) {
    if (obj2[key] != obj1[key]) {
      result[key] = obj2[key];
    }
    if (typeof obj2[key] === '[object Array]' && typeof obj1[key] === '[object Array]') {
      result[key] = compare(obj1[key], obj2[key]);
    }
    if (typeof obj2[key] === 'object' && typeof obj1[key] === 'object') {
      result[key] = compare(obj1[key], obj2[key]);
    }
  }
  console.log(result);
}

Résultat:

Object {0: undefined, 1: undefined}
Object {id: "2", pingedAddresses: undefined, type: "Business"}

Attendu:

{
  "id": "2",
  "details": [{
    "name": "David",
    "address": "Boston",
    "phone": 434323434
  }]
}

4voto

Rajesh Points 3413

Vous pouvez essayer ce qui suit comme simple comparaison:

Note: Cette réponse suppose que la structure est exactement la même. Vous pouvez le prendre comme référence et le rendre plus générique pour les cas où les structures sont différentes.

Points à considérer:

  • Le nombre d'éléments est différent. o1.details a 2 entrées et o2.details ont par exemple 5 entrées.
  • La structure des objets est différente. Les propriétés dans les deux objets sont différentes.

    function getDifference(o1, o2) { var diff = {}; var tmp = null; if (JSON.stringify(o1) === JSON.stringify(o2)) return;

    for (var k in o1) { if (Array.isArray(o1[k]) && Array.isArray(o2[k])) { tmp = o1[k].reduce(function(p, c, i) { var _t = getDifference(c, o2[k][i]); if (_t) p.push(_t); return p; }, []); if (Object.keys(tmp).length > 0) diff[k] = tmp; } else if (typeof(o1[k]) === "object" && typeof(o2[k]) === "object") { tmp = getDifference(o1[k], o2[k]); if (tmp && Object.keys(tmp) > 0) diff[k] = tmp; } else if (o1[k] !== o2[k]) { diff[k] = o2[k] } } return diff; }

    var o1={id:"1",details:[{name:"Peter",address:"Arizona",phone:9900998899},{name:"Jam",address:"Kentucky",phone:56034033343}],profession:"Business"}, o2={id:"2",details:[{name:"Peter",address:"Arizona",phone:9900998899},{name:"David",address:"Boston",phone:434323434}],profession:"Business"};

    var d = getDifference(o1, o2) console.log(d)

J'avais écrit une réponse pour détecter les changements dans les objets. Vous pouvez également vous en inspirer.

0voto

AHBagheri Points 1117

Vous devez exécuter une boucle "for" sur le premier objet et vérifier si le deuxième l'a ou non. Ensuite, enregistrez-le dans un nouveau troisième objet :

var obj3={};
for (var key in obj1)
{
!obj2.hasOwnProperty(key) && obj3[key]=obj[key];

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X