使用Javascript / JQuery在JSON对象中的差异
-
05-07-2019 - |
题
我在Javascript中有两个JSON对象,除了数值之外都是相同的。它看起来像这样:
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"}
}
一个名为“数据”的对象。具有当前值,另一个称为“旧”的对象。从1秒前开始具有相同的值。我想在值中输出只有 change 的JSON对象,这样我就可以计算网络接口上的数据吞吐量。
var throughput = {
"eth0":{"Tx":"100","Rx":"100"},
"eth1":{"Tx":"0","Rx":"0"},
"lo":{"Tx":"0","Rx":"0"}
}
我不确定如何遍历JSON数据 - 它可以用于任意数量的接口。
任何人都可以借给我一个手吗?提前致谢
解决方案
您可以遍历父对象和子对象属性:
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];
}
}
}
}
其他提示
在JavaScript中迭代对象的基本前提是这样的
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
}
}
修复检查器不会太难。你需要递归。我将把它留作你或其他SOer的练习。
也许它已经回答得足够了,但是让我添加我的无耻插件:) 一个JSON(实际上是任何javascript对象或数组结构)diff&补丁库我在github上开源:
https://github.com/benjamine/jsondiffpatch
它生成差异(也是JSON格式,占用空间小),您可以使用客户端(查看测试页面)&服务器端,如果存在,则使用 http://code.google.com / p / google-diff-match-patch / 自动为长字符串。
查看 DEMO 页面,了解其工作原理。
在处理类似问题时,这对我来说很成功。与第一次相比,它获得了第二次的差异。
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);
代码有点特殊,但你得到了一般的想法:P
您可以使用对象遍历模块,例如 nervgh / object-traverse
这样做。
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
});
不隶属于 StackOverflow