2009-07-29 12 views
15

Ich habe zwei JSON-Objekte in Javascript, identisch mit Ausnahme der numerischen Werte. Es sieht wie folgt aus:Unterschied in JSON-Objekten mit 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"} 
} 

Ein Objekt „Daten“ hat die aktuellen Werte genannt, ein weiteres Objekt „alten“ hat die gleichen Werte von 1 Sekunde vor genannt. Ich möchte ein JSON-Objekt mit nur der Änderung in Werten ausgeben, damit ich Datendurchsatz auf den Netzwerkschnittstellen berechnen kann.

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

Ich bin nicht sicher, wie man die JSON-Daten durchquert - es könnte für eine beliebige Anzahl von Schnittstellen sein.

Kann mir bitte jemand eine Hand leihen? Vielen Dank im Voraus

+0

Eine gute Antwort gefunden auch hier: [? Wie kann man die Unterschiede zwischen JavaScript-Objekten Karte] (http://codereview.stackexchange.com/questions/11412/how-can-you-map-the- Unterschiede zwischen javascript-objects/11580 # 11580) – laggingreflex

+0

für clientseitigen Vergleich, vielleicht http://tlrobinson.net/projects/javascript-fun/jsondiff/ kann nützlich sein. – Veverke

Antwort

7

Sie können die Eltern und Kind Objekteigenschaften durchlaufen:

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

Die grundlegende Voraussetzung für über Objekte in JavaScript Iterieren ist wie so

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 
    } 
} 

ein Kontrolleur Fixing würde nicht zu hart sein. Sie benötigen Rekursion. Ich überlasse das als Übung für dich oder eine andere Person.

4

Das ist für mich den Trick, wenn sie mit einem ähnlichen Problem zu tun. Es bekommt die Unterschiede in der Sekunde gegenüber der ersten.

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 ist ein bisschen ein Sonderfall, aber Sie bekommen die allgemeine Idee: P

8

Vielleicht ist es schon genug beantwortet, aber lassen Sie mich meine schamlose Werbung hinzufügen :) Ein JSON (eigentlich jeder Javascript Objekt oder Array-Struktur) diff & Patchbibliothek I öffne um github bezogen:

https://github.com/benjamine/jsondiffpatch

es diffs erzeugt (auch in JSON-Format und mit geringen Platzbedarf), die man verwenden kann cl iient (Überprüfen Sie die Testseite) & Server-Seite, und wenn vorhanden, verwendet es automatisch http://code.google.com/p/google-diff-match-patch/ für lange Zeichenfolgen.

Überprüfen Sie die DEMO Seite, um zu sehen, wie es funktioniert.

+0

+1 Ein ausgeklügelter JSON-Diff-Algorithmus, z.B. Bei String-Attributen muss entschieden werden, ob die vollständige * before * - und * after * -Zeichenfolge verwendet werden soll, oder ob ** diff ** in die Zeichenfolge eingefügt werden soll, abhängig von der Länge des resultierenden diff (ich nehme an). –

+0

Ja, ein Text-Diff ist gemacht, wenn 2 lange (wie lange ist konfigurierbar) Strings gefunden werden (um Diff-Größe zu reduzieren, und auch um Fuzzy-Patching zu ermöglichen). – Benja

0

Sie können dazu ein Objekttraversalmodul wie nervgh/object-traverse verwenden.

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 
}); 
Verwandte Themen