2013-11-08 2 views
0

Мне нужно создать дерево.Дерево JavaScript с узлами, содержащими массивы

Каждый узел имеет два двумерных массива, «statusTable» и «moveTable».

Каждый ребенок должен наследовать его статус статуса родителя (его копию).

Каждый узел должен иметь 10 детей.

Создание дерева должно прекратиться, когда оно достигнет «maxDepth».

Когда я использую приведенный ниже код, я понимаю, что все узлы указывают на один и тот же statusTable.

Любая помощь пожалуйста?

function NODE(p, statTable, movTable, depth) 
{ 
    this.par = p; 
    this.statusTable = statTable.slice(); 
    this.moveTable = movTable.slice(); 
    this.depth = depth; 
} 


function createChildren(parentNode) 
{ 
    var childNode, m; 

    if (parentNode.depth == maxDepth) return; 


    for (m = 0; m < 10; m++) { 

     moveTable = []; 
     mainTable = parentNode.statusTable.slice(); 

     childNode = new NODE(parentNode, mainTable, moveTable, parentNode.depth + 1); 

     createChildren(childNode); 
    } 
} 
+0

Вы уверены, что все узлы указывают на то же statusTable? Каждый statusTable должен быть другим экземпляром массива с теми же ссылками на дочерние элементы. – Naor

+0

@Naor Если я вношу изменения в statusTable для дочернего элемента, это также влияет на statusTable его родителя. Вот почему я считаю, что все они ссылаются на один и тот же массив. – ion

+0

'if (parentNode.depth = maxDepth)' должно быть 'if (parentNode.depth === maxDepth)'. –

ответ

0

Slice создает копию массива, но вы использовали ее только во внешнем массиве. Внутренние массивы одинаковы.

Вы

var inner = [1]; 

var outer = [inner]; 
var copy = outer.slice(); 

copy === outer // false 
copy[0] === outer[0] // true 
copy[0][0] = 3; // problem 
console.log(outer[0][0]) // 3, expecting 1 

Что вам нужно, это глубокая копия вместо среза:

function deepCopy(arr) { 
    var copy = arr.slice(); 
    for (var i=0; i<copy.length; i++) { 
    if (copy[i] instanceof Array) { 
     copy[i] = deepCopy(copy[i]); 
    } 
    } 
    return copy; 
} 
+1

О, боже мой! Ты мужчина!! Последние три дня я пытался справиться с этим. Я никогда об этом не подумал. Большое спасибо. – ion

+0

После того, как все закончилось, нужно ли вручную освобождать память, используемую деревом, или это делается автоматически? Если вручную, есть ли простой способ сделать это? – ion

+0

Любая структура, к которой у вас нет ссылки (не имеющей способа доступа), будет автоматически собираться мусором. – Tibos

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