Domanda

Ho due oggetti JSON in Javascript, identici ad eccezione dei valori numerici. Sembra così:

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 oggetto chiamato " data " ha i valori correnti, un altro oggetto chiamato " vecchio " ha gli stessi valori da 1 secondo fa. Vorrei produrre un oggetto JSON con solo la modifica in valori in modo da poter calcolare il throughput dei dati sulle interfacce di rete.

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

Non sono sicuro di come attraversare i dati JSON - potrebbe essere per qualsiasi numero di interfacce.

Qualcuno può darmi una mano, per favore? Grazie in anticipo

È stato utile?

Soluzione

È possibile scorrere le proprietà dell'oggetto padre e figlio:

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

Altri suggerimenti

La premessa di base per iterare gli oggetti in JavaScript è così

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

Riparare una pedina non sarebbe troppo difficile. Avrai bisogno di ricorsione. Lo lascerò come esercizio per te o per un altro SOER.

Forse ha già risposto abbastanza, ma lasciami aggiungere la mia spina spudorata :) Un diff & amp JSON (in realtà qualsiasi oggetto javascript o struttura di array) libreria di patch che apro da Github:

https://github.com/benjamine/jsondiffpatch

genera diff (anche in formato JSON e con un footprint ridotto), che puoi usare client (controlla la pagina di test) & amp; lato server e, se presente, utilizza http://code.google.com / p / google-diff-match-patch / per stringhe lunghe automaticamente.

controlla la DEMO per vedere come funziona.

Questo ha fatto il trucco per me quando ho a che fare con un problema simile. Ottiene le differenze nel secondo rispetto al primo.

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);

Il codice è un po 'un caso speciale, ma ottieni l'idea generale: P

Puoi utilizzare un modulo di attraversamento di oggetti come nervgh / object-traverse per fare questo.

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
});
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top