如何有效比较JSON中的更改并进行跟踪

时间:2018-10-01 16:09:57

标签: javascript json

我有一个很大的嵌套对象(stringify出现4mb),类似于以下内容,深度为15-20级:

{
  "a": 5,
  "b": {
      "0": 1,
      "1": "x",
      "length": 2
   },
  "x": {
      "a": 1,
      "1": "z"
  },
  "c": {
      "0": 3,
      "1": "Am",
      "3": {
          "0": 3,
          "1": "x",
          "2": {
              "0": 3,
              "1": "Y",
              "length": 2
          },
          "length": 3
      },
      "length": 4
  }
}

页面上的每个操作之后,对象的某些属性都会更改,例如上面的内容如下(请参阅c [“ 3”] [“ 2”]):

{
  "a": 5,
  "b": {
      "0": 1,
      "1": "x",
      "length": 2
   },
  "x": {
      "a": 1,
      "1": "z"
  },
  "c": {
      "0": 3,
      "1": "Am",
      "3": {
          "0": 3,
          "1": "x",
          "2": {z:5,n:"y"},
          "length": 3
      },
      "length": 4
  }
}

我不能每次都存储整个对象,因为它将溢出内存。因此,我只想跟踪更改。 因此,当重播动作时,我将只更改对象的那一部分,它将显示新的对象。

注意:我不想以迭代的方式进行对象比较,因为对象大小非常大,计算也会花很多钱。

我不知道该如何开始。

我认为散列对象属性应该有所帮助(就像angularJS在其摘要循环中一样)。

2 个答案:

答案 0 :(得分:1)

您拥有大量的js库,它们能够计算两个JSON负载之间的差异,通常以可稍后应用的补丁的形式出现

  • 在原始有效载荷上获取新版本
  • 或以反向模式使用最新版本以恢复到原始版本。

例如:

https://json-delta.readthedocs.io/en/latest/philosophy.html https://github.com/benjamine/jsondiffpatch

答案 1 :(得分:1)

我认为,如果您较早计划而不是使用库,则可以进一步优化。 我认为这是在后台平铺您的对象。在每个更改状态,只需将diff与 git 一样保存即可。最后,要还原为时间戳记,只需以相反的顺序合并即可获得最终对象。

您应该做的是创建一个像这样的属性

“ user.name.first”:“ rohit”

然后递归地创建扁平化对象,相应地创建差异,然后仅保存差异。

创建某个时间戳的原始对象,只需递归合并即可。您可以记忆以进一步改善。