使用 Javascript/JQuery 的 JSON 对象差异

IT技术 javascript jquery json
2021-03-15 08:33:47

我在 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 数据 - 它可以用于任意数量的接口。

谁能帮我一把?提前致谢

6个回答

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

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

https://github.com/benjamine/jsondiffpatch

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

检查演示页面以了解它是如何工作的。

+1一个复杂的JSON DIFF算法,例如用绳子属性,决定是否使用完整的后的字符串或者做一个差异的字符串,具体取决于所产生的差异(我认为)的长度。
2021-04-23 08:33:47
是的,当找到 2 个长(多长可配置)字符串时,文本差异就会完成(为了减少差异大小,并允许模糊修补)。
2021-05-09 08:33:47

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

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

您可以使用对象遍历modulenervgh/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
});