【问题标题】:How efficiently compare changes in JSON and keep track of it如何有效地比较 JSON 中的变化并跟踪它
【发布时间】:2018-10-01 16:09:57
【问题描述】:

我有一个非常大的嵌套对象(字符串化为 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 在其摘要周期中所做的那样)。

【问题讨论】:

  • 为什么不用数据库?
  • 我正在开发 chrome 扩展。
  • 不要使用大引号来强调。仅在引用某些内容时使用块引用。
  • 好的,谢谢先生
  • 为什么不存储动作?... 一种“命令”模式的方法。

标签: javascript json


【解决方案1】:

我认为,如果您提前计划而不是使用库,则可以进一步优化。 我认为是在背景中压平你的物体。在每个更改状态下,只需像 git 一样保存差异。最后要恢复到时间戳,只需以相反的顺序合并即可获得最终对象。

你应该做的是创建一个类似的属性

"user.name.first" : "rohit"

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

创建某个时间戳的原始对象,只需递归合并。您可以通过记忆来进一步提高。

【讨论】:

  • 喜欢“user.name.first”。 :“罗希特”
【解决方案2】:

您有大量的 js 库可以计算两个 JSON 有效负载之间的差异,通常以补丁的形式,以后可以应用

  • 在原始有效负载上获取新版本
  • 或在最新版本上以反向模式返回原始版本。

例如:

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

【讨论】:

  • 这适用于大尺寸的 JSON 吗?你能推荐一个支持以 MB 为单位的 JSON 的算法吗?
猜你喜欢
  • 1970-01-01
  • 2013-12-14
  • 2015-06-06
  • 2011-02-17
  • 1970-01-01
  • 1970-01-01
  • 2013-06-04
  • 1970-01-01
  • 2012-11-09
相关资源
最近更新 更多