[英]JavaScript deep copy of an object graph
我需要一个能够在JavaScript中复制对象的深层功能的函数。 每个对象都是较大图的一部分(因此需要深度复制功能)。 例如,
//Node "class" with references to its parent and children
var MyNode = (function () {
function MyNode() {
this.children = undefined;
this.parent = undefined;
}
return MyNode;
})();
该图没有循环。
我的想法是对图形进行深度优先搜索,并使用一个字典来存储每个Node的哈希值及其副本。 在访问每个节点时,将从字典中查找复制父对象,并将该节点添加到其父子对象集合中。 我的问题是,要使此方法起作用,我需要能够掌握每个Node的内存位置。
这是我的一般想法:
function(rootNode) {
var magicDictionary = {};
var stack = {rootNode};
while(stack.length > 0) {
var current = stack.pop();
//Performs a shallow copy, not including the parent or children references
var newNode = new MyNode(current);
//Get our new node's parent based on our old node's parent
newNode.parent = magicDictionary[current.parent];
//Add this new node as a child
newNode.parent.children.push(newNode);
//Continue the DPS
for(var i = 0; i < current.children.length; i++)
stack.push(current.children[i]);
}
}
字典在这里是个大问题。 它实际上需要在内存位置上进行哈希处理,因为即使哈希码函数也不能对每个对象唯一。
有一个更好的方法吗?
除了使用哈希码,还可以使用WeakMap
。 他们本质上是在做同样的事情:为您提供唯一性检测器。 但是没有散列算法的成本,它没有冲突并且不占用太多内存。
如果您搜索,则可以找到WeakMaps的自定义实现,以防万一您使用的浏览器尚不支持WeakMaps。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.