2014-01-22 2 views
1

Я пытаюсь пройти цепочку отношений parent-> child, пока мы не достигнем родителя, у которого нет собственного родителя. Если у ребенка есть родитель, мы сохраняем этот родительский объект в массиве вместе с родителями этого родителя. Если родительский элемент не имеет родителя, мы храним пустой массив.Рекурсивный Javascript: child-> parent relationship

Вот несколько псевдо-JSON, показывающих структуру данных, которую я хочу.

Node3 = { // Node 3 
    parent: { // Node 2 
     parent: { // Node 1 
     parent: null, 
     parentTree: [] 
     }, 
     parentTree: [Node1] 
    }, 
    parentTree: [Node2, Node1] 
} 

Вот функция конструктора и рекурсивный метод до сих пор ...

function Node(parent) { 
    this.parent = typeof parent !== 'undefined' ? parent : null; 
} 

Node.prototype.getParentTree = function() { 
    if(typeof this.parentTree === "undefined") { 
     if (this.parent !== null) { 
      this.parentTree = this.parent.getParentTree(); 
      this.parentTree.push(this.parent); 
     } else { 
      this.parentTree = []; 
     } 
    } 
    return this.parentTree; 
} 

Вот как я тестирую метод:

var node1 = new Node(); 
var node2 = new Node(node1); 
var node3 = new Node(node2); 

node3.getParentTree(); 

Проблема с током метод состоит в том, что parentTree для node1, node2 и node3 имеет длину === 2. При проверке объектов в parentTree они содержат пары под-объектов до бесконечности.

ответ

2
this.parentTree = this.parent.getParentTree(); 
this.parentTree.push(this.parent); 

Таким образом, оба родитель и ребенок parentTree относится к тому же объекту Array, - так что вы добавление нового узла в дерево родителя, а также.

Создать копию массива с помощью slice:

return this.parentTree.slice(); // every time the getter is called 

или

this.parentTree = this.parent.getParentTree().slice(); // only for manipulating 
+0

работал большой, и теперь я вижу, где моя проблема была. Спасибо! – keepitreal

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