我需要一个在JavaScript中制作对象的深层副本的函数。每个对象都是较大图形的一部分(因此需要深度复制功能)。例如,
//Node "class" with references to its parent and children
var MyNode = (function () {
function MyNode() {
this.children = undefined;
this.parent = undefined;
}
return MyNode;
})();
图表没有循环。
我的想法是通过图表进行深度优先搜索,并使用一个字典来存储每个节点的散列及其副本。访问每个节点时,将从字典中查找复制父节点,并将节点添加到其父节点子集合中。我的问题是,要使这个方法起作用,我需要能够拥有每个节点的内存位置。
这是我的总体想法:
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]);
}
}
字典是这里的大问题。它需要在内存位置实际散列,因为即使是散列码函数也不能是每个对象唯一的。
有更好的方法吗?
答案 0 :(得分:1)
您可以使用WeakMap
,而不是使用哈希码。他们基本上做同样的事情:给你一个唯一性探测器。但是,如果没有散列算法的成本,它就是无冲突的,并且不会占用太多内存。
如果您搜索,您可以找到WeakMaps的自定义实现,但是您使用的是不支持WeakMaps的浏览器。