Pregunta

Tengo dos objetos JSON en Javascript, idénticos a excepción de los valores numéricos. Se parece a esto:

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 objeto llamado " data " tiene los valores actuales, otro objeto llamado " antiguo " tiene los mismos valores de hace 1 segundo. Me gustaría generar un objeto JSON con solo el cambio en los valores para poder calcular el rendimiento de datos en las interfaces de red.

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

No estoy seguro de cómo atravesar los datos JSON, podría ser para cualquier número de interfaces.

¿Alguien puede echarme una mano? Gracias de antemano

¿Fue útil?

Solución

Puede iterar a través de las propiedades del objeto principal y secundario:

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

Otros consejos

La premisa básica para iterar sobre objetos en JavaScript es así

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

Reparar un comprobador no sería demasiado difícil. Necesitarás recurrencia. Lo dejaré como un ejercicio para usted u otro SOer.

Tal vez ya haya respondido lo suficiente, pero déjame agregar mi complemento descarado :) Un JSON (en realidad cualquier objeto javascript o estructura de matriz) diff & amp; biblioteca de parches que abro con código fuente en github:

https://github.com/benjamine/jsondiffpatch

genera diferencias (también en formato JSON y con una huella pequeña), que puede usar el cliente (verifique la página de prueba) & amp; lado del servidor, y si está presente, utiliza http://code.google.com / p / google-diff-match-patch / para cadenas largas automáticamente.

consulte la página DEMO para ver cómo funciona.

Esto me sirvió para tratar un problema similar. Obtiene las diferencias en segundo comparado con el primero.

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

El código es un caso un poco especial, pero tienes la idea general: P

Puede usar un módulo de recorrido de objetos como nervgh / object-traverse para hacer esto.

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
});
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top