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. それらは基本的に同じことを行います。つまり、一意性検出器を提供します。しかし、ハッシュ アルゴリズムのコストがなければ、衝突がなく、多くのメモリを使用しません。

WeakMap のサポート

検索すると、WeakMaps をまだサポートしていないブラウザーを使用している場合に備えて、WeakMaps のカスタム実装を見つけることができます。

于 2013-08-28T16:26:26.650 に答える