Diferencia en objetos JSON usando Javascript / JQuery
-
05-07-2019 - |
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
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
});