JavaScript对象图的深层副本

时间:2013-08-28 16:20:12

标签: javascript deep-copy 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;
})();

图表没有循环。

我的想法是通过图表进行深度优先搜索,并使用一个字典来存储每个节点的散列及其副本。访问每个节点时,将从字典中查找复制父节点,并将节点添加到其父节点子集合中。我的问题是,要使这个方法起作用,我需要能够拥有每个节点的内存位置。

这是我的总体想法:

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]);
    }
}

字典是这里的大问题。它需要在内存位置实际散列,因为即使是散列码函数也不能是每个对象唯一的。

有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

您可以使用WeakMap,而不是使用哈希码。他们基本上做同样的事情:给你一个唯一性探测器。但是,如果没有散列算法的成本,它就是无冲突的,并且不会占用太多内存。

Support for WeakMaps

如果您搜索,您可以找到WeakMaps的自定义实现,但是您使用的是不支持WeakMaps的浏览器。