Frage

Ich habe zwei JSON-Objekte in Javascript, identisch mit Ausnahme der numerischen Werte. Es sieht wie folgt aus:

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 mit dem Namen „data“ die aktuellen Werte hat, ein anderes Objekt mit dem Namen „alten“ hat die gleichen Werte von 1 Sekunde vor. Ich mag ein JSON-Objekt zur Ausgabe nur mit der Veränderung in Werten, so kann ich den Datendurchsatz auf den Netzwerkschnittstellen berechnen.

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

Ich bin mir nicht sicher, wie etwa Durchqueren der JSON-Daten zu gehen - es für eine beliebige Anzahl von Schnittstellen sein könnte

.

Kann jemand bitte geben Sie mir eine Hand? Vielen Dank im Voraus

War es hilfreich?

Lösung

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

Andere Tipps

Die grundlegende Prämisse über Objekte in JavaScript für Iterieren wie so ist

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 werden Rekursion benötigen. Ich werde das für Sie als Übung verlassen oder eine andere SOER.

Vielleicht ist es schon beantwortet genug, aber lassen Sie mich meine schamlose Werbung hinzufügen :) Ein JSON (eigentlich jedes JavaScript-Objekt oder Array-Struktur) diff & Patchbibliothek I bei github bezogen geöffnet:

https://github.com/benjamine/jsondiffpatch

es erzeugt diffs (auch im JSON-Format und mit geringen Platzbedarf), die Sie Client (überprüfen Sie die Testseite) und Server-Seite, und, falls vorhanden verwenden können, verwendet es? http://code.google.com/p/google-diff-match-patch/ für lange Strings automatisch .

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

Das hat für mich den Trick, wenn sie mit einem ähnlichen Problem zu tun. Es wird die Unterschiede in der zweiten gegenüber dem 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

Sie können ein Objekt Traversal-Modul wie nervgh/object-traverse dies zu tun.

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
});
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top