序列化和深拷贝循环引用对象 Serialize and deep copy circular reference objects
Attributes
Includes Deno configuration
Current version released
2 years ago
Versions
Serialize-and-deep-copy-circular-reference-objects
介绍
序列化和深拷贝循环引用对象
Serialize and deep copy circular reference objects
软件架构
使用哈希表和深度优先搜索对循环引用对象进行深拷贝和序列化
序列化和反序列化时,对每个对象进行编号"Symbol.identity"
,如果遇到重复的对象,使用编号引用"Symbol.reference"
进行表示
使用说明
https://deno.land/x/masx200_serialize_circular_reference
函数cloneDeep
:可自定义的深拷贝循环引用对象的方法,可以把JSON不支持的类型转换成JSON支持的类型,也可反向转换
函数circularParse
:从JSON解析一个循环引用对象
函数circularStringify
:把循环引用对象序列化成JSON
function teststringify(origin: any) {
const cloned = cloneDeep(origin, ...replacerCustomizers);
console.log("origin", origin);
console.log("cloned", cloned);
const stringified = circularStringify(cloned);
console.log("stringified", stringified);
}
function testparse(case1: any) {
console.log("stringified", case1);
const parsed1 = circularParse(case1);
console.log("parsed", parsed1);
console.log("cloned", cloneDeep(parsed1, ...reviverCustomizers));
}
例子
stringified {"a":{"Symbol.reference":0},"Symbol.identity":0}
parsed <ref *1> { a: [Circular *1] }
stringified {
"0": {
"0": 1,
"Symbol.toStringTag": "Array",
"length": 1,
"Symbol.identity": 1
},
"1": {
"Symbol.reference": 0
},
"Symbol.toStringTag": "Array",
"length": 2,
"Symbol.identity": 0
}
parsed <ref *1> {
"0": { "0": 1, "Symbol.toStringTag": "Array", length: 1 },
"1": [Circular *1],
"Symbol.toStringTag": "Array",
length: 2
}
cloned [ [ 1 ], [Circular *1] ]
origin <ref *3> TreeNode {
val: 0.5880302339096724,
left: <ref *2> TreeNode {
val: 9.125346300899016,
left: <ref *1> TreeNode {
val: 8.00411854488926,
left: TreeNode { val: 7.8539983781024985, left: [Object], right: [Circular *1] },
right: [Circular *2]
},
right: [Circular *3]
},
right: <ref *4> TreeNode {
val: 1.829227394260811,
left: [Circular *3],
right: <ref *5> TreeNode {
val: 2.998137681404465,
left: [Circular *4],
right: TreeNode { val: 3.6831026696928055, left: [Circular *5], right: [Object] }
}
}
}
cloned <ref *3> TreeNode {
val: 0.5880302339096724,
left: <ref *2> TreeNode {
val: 9.125346300899016,
left: <ref *1> TreeNode {
val: 8.00411854488926,
left: TreeNode {
val: 7.8539983781024985,
left: [Object],
right: [Circular *1],
"Symbol.toStringTag": "TreeNode"
},
right: [Circular *2],
"Symbol.toStringTag": "TreeNode"
},
right: [Circular *3],
"Symbol.toStringTag": "TreeNode"
},
right: <ref *4> TreeNode {
val: 1.829227394260811,
left: [Circular *3],
right: <ref *5> TreeNode {
val: 2.998137681404465,
left: [Circular *4],
right: TreeNode {
val: 3.6831026696928055,
left: [Circular *5],
right: [Object],
"Symbol.toStringTag": "TreeNode"
},
"Symbol.toStringTag": "TreeNode"
},
"Symbol.toStringTag": "TreeNode"
},
"Symbol.toStringTag": "TreeNode"
}
stringified {
"val": 0.5880302339096724,
"left": {
"val": 9.125346300899016,
"left": {
"val": 8.00411854488926,
"left": {
"val": 7.8539983781024985,
"left": {
"val": 6.001457616409839,
"left": {
"val": 5.479078167073621,
"left": {
"val": 4.1469239540288365,
"left": {
"val": 3.6831026696928055,
"left": {
"val": 2.998137681404465,
"left": {
"val": 1.829227394260811,
"left": {
"Symbol.reference": 0
},
"right": {
"Symbol.reference": 8
},
"Symbol.toStringTag": "TreeNode",
"Symbol.identity": 9
},
"right": {
"Symbol.reference": 7
},
"Symbol.toStringTag": "TreeNode",
"Symbol.identity": 8
},
"right": {
"Symbol.reference": 6
},
"Symbol.toStringTag": "TreeNode",
"Symbol.identity": 7
},
"right": {
"Symbol.reference": 5
},
"Symbol.toStringTag": "TreeNode",
"Symbol.identity": 6
},
"right": {
"Symbol.reference": 4
},
"Symbol.toStringTag": "TreeNode",
"Symbol.identity": 5
},
"right": {
"Symbol.reference": 3
},
"Symbol.toStringTag": "TreeNode",
"Symbol.identity": 4
},
"right": {
"Symbol.reference": 2
},
"Symbol.toStringTag": "TreeNode",
"Symbol.identity": 3
},
"right": {
"Symbol.reference": 1
},
"Symbol.toStringTag": "TreeNode",
"Symbol.identity": 2
},
"right": {
"Symbol.reference": 0
},
"Symbol.toStringTag": "TreeNode",
"Symbol.identity": 1
},
"right": {
"Symbol.reference": 9
},
"Symbol.toStringTag": "TreeNode",
"Symbol.identity": 0
}