2013-08-28 2 views
1

Мне нужна функция, которая делает глубокую копию объекта в 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 не может быть уникальной для каждого объекта.

Есть ли лучший способ сделать это?

ответ

1

Вместо использования хэш-кодов вы можете использовать WeakMap. Они по сути делают то же самое: дайте вам детектор уникальности. Но без стоимости алгоритма хэширования он не содержит конфликтов и не использует много памяти.

Support for WeakMaps

Если вы ищете вы можете найти пользовательские реализаций WeakMaps упаковывают вы используете браузер, который не поддерживает WeakMaps еще.

+0

Это прекрасно. Если только поддержка в браузерах была лучше. Хром, в частности, торчит как больной палец. – MgSam

+0

Да, но вы можете найти реализацию WeakMap на github. – Halcyon

Смежные вопросы