检测两个对象之间的差异(JSON)

时间:2014-06-30 12:13:01

标签: javascript jquery json

我有一个远程JSON文件,其中包含登录服务的最后100个用户的列表。此JSON不断更新,并列出最近登录到“最近”登录的用户。

如果显示为X号的用户重新登录,则会从位置X移除它们并将其放回位置[0]的JSON顶部。

我每5分钟检索一次JSON。我想要做的是检测旧对象oldUsers和新newUsers之间的差异,并将它们存储在另一个对象中,该对象只包含newUsers中存在的用户但是不在oldUsers。关于如何实现这个目标,我并不知道。

这是JSON结构:

[{
    "id":"foo09",
    "name":"John",
    "age":28
},    {
    "id":"bar171",
    "name":"Bryan",
    "age":36
},
...
]

有没有一种相当简单的方法呢?谢谢!

1 个答案:

答案 0 :(得分:0)

您需要编写自己的diff算法。 JSBin中的Here is one I whipped up

我需要一个实用程序函数来合并两个数组(Underscore会有帮助)。

function mergeArrays(val1, val2) {
  var results = val1.splice(0);
  val2.forEach(function(val) {
    if (val1.indexOf(val) < 0) {
      results.push(val);
    }
  });
  return results;
}

Diff算法

function diff(val1, val2) {
  var results  = [];
  var origKeys = Object.keys(val1);
  var newKeys  = Object.keys(val2);

  mergeArrays(origKeys, newKeys)
    .forEach(function(key) {
      if (val1[key] === val2[key]) { return; }
      var result = {
        key:   key,
        orig:  val1[key],
        'new': val2[key]
      };
      if (val1[key] == null) {
         result.type = 'add';
      } else if (val2[key] == null) {
        result.type = 'delete';
      } else {
        result.type = 'change';
      }
      results.push(result);
    });
  return results;
}
相关问题