Мне нужна функция, которая делает глубокую копию объекта в JavaScript. Каждый объект является частью более крупного графика (таким образом, требуется функция глубокой копии). Например,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]);
}
}
Словарь является большой проблемой здесь. Это необходимо для фактического хеширования в памяти, потому что даже функция hashcode не может быть уникальной для каждого объекта.
Есть ли лучший способ сделать это?
Это прекрасно. Если только поддержка в браузерах была лучше. Хром, в частности, торчит как больной палец. – MgSam
Да, но вы можете найти реализацию WeakMap на github. – Halcyon