使用Javascript/JQuery时JSON对象的差异

使用Javascript/JQuery时JSON对象的差异,javascript,jquery,json,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

我在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对象,只改变值,这样我就可以计算网络接口上的数据吞吐量

var throughput = {
  "eth0":{"Tx":"100","Rx":"100"},
  "eth1":{"Tx":"0","Rx":"0"},
  "lo":{"Tx":"0","Rx":"0"}
}
我不知道如何遍历JSON数据——它可以用于任何数量的接口

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

谁能帮我一把吗?提前感谢

在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作为练习。

您可以遍历父对象和子对象属性:

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

在处理类似问题时,这对我起到了作用。它得到秒与第一秒的差异

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

也许它已经有足够的答案,但让我添加我的无耻插头:) JSON(实际上是任何javascript对象或数组结构)差异和补丁库我在github开源:

它生成diff(也是JSON格式,占用空间小),您可以使用客户端(检查测试页面)和服务器端,如果存在,它会自动用于长字符串


查看页面以了解其工作原理。

您可以使用类似的对象遍历模块来完成此操作

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
});
var result={}
遍历(旧的、函数(节点、值、键、路径){
var resultObject=结果
对于(var n=0;n这里有一个使用的解决方案。我们还没有测试它,但是这个解决方案应该非常快,因为我们跟踪了两个参考

//const objectScan=require('object-scan');
const data={eth0:{Tx:'4136675',Rx:'13232319'},eth1:{Tx:'4',Rx:'0'},lo:{Tx:'471290',Rx:'471290'};
const old={eth0:{Tx:'4136575',Rx:'13232219'},eth1:{Tx:'4',Rx:'0'},lo:{Tx:'471290',Rx:'471290'};
const computeThroughput=(dataOld,dataNew)=>objectScan(['**']{
breakFn:({property,value,context:{stack,result}})=>{
如果(属性===未定义){
返回;
}
const stackRef=stack[stack.length-1][property];
stack.push(stackRef);
const resultRefParent=result[result.length-1];
if(!(resultRefParent中的属性)){
如果(stackRef的类型=='string'){
resultRefParent[property]=字符串(Number.parseFloat(stackRef)-Number.parseFloat(value));
}否则{
resultRefParent[property]={};
}
}
const resultRef=resultRefParent[property];
结果推送(resultRef);
},
filterFn:({context:{stack,result}})=>{
stack.pop();
result.pop();
}
})(数据旧{
堆栈:[dataNew],
结果:[{}]
}).结果[0];
log(computeThroughput(旧,数据));
/* => {
lo:{Rx:'0',Tx:'0'},
eth1:{Rx:'0',Tx:'0'},
eth0:{Rx:'100',Tx:'100'}
}*/
。作为控制台包装{最大高度:100%!重要;顶部:0}

+1复杂的json差异算法,例如,使用字符串属性,决定是使用完整的前后字符串还是在字符串内部进行差异,这取决于结果差异的长度(我假设)。是的,当找到2个长(可配置的长度)字符串时,将执行文本差异(为了减少差异大小,同时允许模糊修补)。这里也找到了一个很好的答案:对于客户端比较,可能是有用的。这是否回答了您的问题?