我有一个很大的嵌套对象(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在其摘要循环中一样)。
答案 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”
然后递归地创建扁平化对象,相应地创建差异,然后仅保存差异。
创建某个时间戳的原始对象,只需递归合并即可。您可以记忆以进一步改善。