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]);
}
}
ここで大きな問題となるのが辞書です。ハッシュコード関数でさえオブジェクトごとに一意にすることはできないため、メモリの場所で実際にハッシュする必要があります。
これを行うより良い方法はありますか?