2009-07-29 7 views
15

J'ai deux objets JSON en Javascript, identiques à l'exception des valeurs numériques. Il ressemble à ceci:Différence entre les objets JSON en utilisant Javascript/JQuery

var data = { 
    "eth0":{"Tx":"4136675","Rx":"13232319"}, 
    "eth1":{"Tx":"4","Rx":"0"}, 
    "lo":{"Tx":"471290","Rx":"471290"} 
} 

var old = { 
    "eth0":{"Tx":"4136575","Rx":"13232219"}, 
    "eth1":{"Tx":"4","Rx":"0"}, 
    "lo":{"Tx":"471290","Rx":"471290"} 
} 

Un objet appelé « données » a les valeurs actuelles, un autre objet appelé « vieux » a les mêmes valeurs d'il y a 1 seconde. Je souhaite exporter un objet JSON avec uniquement les valeurs pour pouvoir calculer le débit de données sur les interfaces réseau.

var throughput = { 
    "eth0":{"Tx":"100","Rx":"100"}, 
    "eth1":{"Tx":"0","Rx":"0"}, 
    "lo":{"Tx":"0","Rx":"0"} 
} 

Je ne suis pas sûr de savoir comment s'y prendre pour parcourir les données JSON - il pourrait être pour un certain nombre d'interfaces.

Quelqu'un peut-il me prêter un coup de main? Merci à l'avance

+0

Une bonne réponse aussi trouvé ici: [? Comment cartographier les différences entre les objets JavaScript] (http://codereview.stackexchange.com/questions/11412/how-can-you-map-the- différences-between-javascript-objects/11580 # 11580) – laggingreflex

+0

pour la comparaison côté client, peut-être http://tlrobinson.net/projects/javascript-fun/jsondiff/ peut être utile. – Veverke

Répondre

7

Vous pouvez parcourir les propriétés parent et objet enfant:

var diff = {}; 
for(var p in data){ 
    if (old.hasOwnProperty(p) && typeof(data[p]) == 'object'){ 
    diff[p] = {}; 
    for(var i in data[p]){ 
     if (old[p].hasOwnProperty(i)){ 
     diff[p][i] = data[p][i] - old[p][i]; 
     } 
    } 
    } 
} 
14

Le principe de base pour itérer sur les objets JavaScript est comme si

var whatever = {}; // object to iterate over 
for (var i in whatever) 
{ 
    if (whatever.hasOwnProperty(i)) 
    { 
    // i is the property/key name 
    // whatever[i] is the value at that property 
    } 
} 

de fixation un vérificateur ne serait pas trop dur. Vous aurez besoin de récursivité. Je vais laisser cela comme un exercice pour vous ou un autre SOer.

4

Cela a fait l'affaire pour moi face à un problème similaire. Il obtient les différences en seconde par rapport à la première.

var first = originalObj; 
    var second = modifiedObj; 
    var diff = {}; 

    var differ = function(first, second, result) { 
     var i = 0; 
     for (i in first) { 
      if (typeof first[i] == "object" && typeof second[i] == "object") { 
       result[i] = differ(first[i], second[i], {}); 
       if (!result[i]) delete result[i]; 
      } else if (first[i] != second[i]) { 
       result[i] = second[i]; 
      } 
     } 
     return isEmpty(result) ? undefined : result; 
    } 

    differ(old_conf, new_conf, diff); 
code

est un peu un cas particulier, mais vous avez l'idée générale: P

8

Peut-être qu'il est déjà assez répondu, mais laissez-moi ajouter mon plug sans vergogne :) A JSON (en fait tout javascript structure de l'objet ou tableau) diff & bibliothèque patch I en open source sur GitHub:

https://github.com/benjamine/jsondiffpatch

génère diffs (également au format JSON, et avec un faible encombrement), que vous pouvez utiliser cl ient (vérifiez la page de test) & côté serveur, et s'il est présent, il utilise http://code.google.com/p/google-diff-match-patch/ pour les chaînes longues automatiquement.

consultez la page DEMO pour voir comment cela fonctionne.

+0

+1 Un algorithme sophistiqué de diff de json, par ex. avec des attributs de chaîne, la décision d'utiliser les chaînes complètes * before * et * after * ou de faire un diff ** dans ** la chaîne, en fonction de la longueur du diff résultant (je suppose). –

+0

Oui, un diff de texte est fait quand 2 chaînes longues (combien de temps est configurable) sont trouvées (afin de réduire la taille de diff, et aussi pour permettre le patch flou). – Benja

0

Pour ce faire, vous pouvez utiliser un module de traversée d'objet tel que nervgh/object-traverse.

var result = {} 
Object.traverse(old, function(node, value, key, path) { 
    var resultObject = result 
    for(var n=0; n<path.length-1; n++) { 
    resultObject = resultObject[path[n]] 
    } 
    resultObject[key] = value 
}); 
Questions connexes