使用Javascript / JQuery的JSON对象的区别

我有两个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"} } 

一个名为“data”的对象具有当前值,另一个名为“old”的对象在1秒前具有相同的值。 我想输出一个JSON对象只有值的变化 ,所以我可以计算networking接口上的数据吞吐量。

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

修复一个检查器不会太难。 你需要recursion。 我将把它作为你或另一个SOE的练习。

也许它已经足够回答了,但让我加我无耻的插件:)一个JSON(实际上任何JavaScript对象或数组结构)diff&补丁库我打开源github:

https://github.com/benjamine/jsondiffpatch

它会生成差异(也是JSON格式,占用空间很小),您可以使用客户端(检查testing页面)和服务器端,如果存在,则使用http://code.google.com/p/google -diff-match-patch /自动为长string。

检查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 });