【问题标题】:JavaScript deep copy of an object graph对象图的 JavaScript 深拷贝
【发布时间】:2013-08-28 16:20:12
【问题描述】:

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

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

有没有更好的方法来做到这一点?

【问题讨论】:

    标签: javascript deep-copy object-graph


    【解决方案1】:

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

    Support for WeakMaps

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

    【讨论】:

    • 太完美了。如果跨浏览器的支持更好的话。 Chrome 在这里尤其突出。
    • 是的,但是你可以在 github 上找到 WeakMap 的实现。
    猜你喜欢
    • 1970-01-01
    • 2015-09-14
    • 1970-01-01
    • 2012-06-19
    • 2019-11-17
    • 1970-01-01
    • 1970-01-01
    • 2012-01-29
    • 2011-04-26
    相关资源
    最近更新 更多