1

我需要一个在 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]);
    }
}

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

有一个更好的方法吗?

4

1 回答 1

1

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

支持弱映射

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

于 2013-08-28T16:26:26.650 回答