2014-12-15 2 views
4

Мне нужно клонировать дерево, которое я сделал, используя TreeModel.js. Что мне нужно сделать, это дублировать его, вносить в него изменения и проверять, уменьшилось ли количество узлов. Если это так, вернитесь к исходному дереву. Вот небольшой пример того, что я до сих пор, чтобы дублировать его, что не является правильным:Клонирование дерева JS TreeModel

var tree = new TreeModel(); 
var root = tree.parse({ 
    id: 0, 
    name: "Root", 
    children: [{id: 1, name: "1", children: []},{id: 2, name: "2", children: []}] 
}); 

console.log(root) 
var dup = tree.parse(root) 
console.log(dup) 

Вот Fiddle. Вы увидите разницу между деревьями, глядя на консоли:

Node {config: Object, model: Object, children: Array[2], isRoot: function, hasChildren: function…} 
Node {config: Object, model: Node, children: Array[2], isRoot: function, hasChildren: function…} 

Есть ли способ, чтобы правильно клонировать такую ​​структуру? Я искал клонирование объекта JS, но все же, я не могу найти способ клонирования этого объекта в точности (например, прототипы таких свойств, как модель ...)

ответ

2

Вы можете глубоко клонировать модель первого дерева и разыгрывать ее снова, чтобы получить второе дерево.

Принимая на вашем примере:

function deepCopy(obj) { 
    // You can also use the jquery extend method here 
    return JSON.parse(JSON.stringify(obj)); 
} 

var dup = tree.parse(deepCopy(root.model)); 

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

+1

Ты тот, кто написал эту библиотеку правильно? Тогда есть ли разница с простое выполнение: 'tree.parse (root.model);'? – Johy

+0

Да. И да, я только что отредактировал ответ, чтобы прояснить это. – JNS

+0

Фантастический. Большое вам спасибо за библиотеку и за этот ответ. ;-) – Johy

0

Почему бы не попробовать глубокую копию jQuery?

var dup = jQuery.extend(true, {}, tree) 

Я пробовал вашу скрипку, но, похоже, она не работает.

+0

Проверили ли вы консоли? Вот где я могу проверить структуру. Да, я пробовал глубокую копию, но все же, я не могу получить точную копию. Посмотрите на консоль в этом обновленном Fiddle: http://jsfiddle.net/pvzb9vd2/5/ – Johy

+0

Да, я понял, что слишком поздно, что вы не писали в «лог», а на консоли. И я согласен, это не тот самый объект. –

+1

Я думаю, что нашел это решение: var dup2 = tree.parse (root.model) * Редактировать: хорошо, вы тоже его нашли :) –

1

я, наконец, пришли к решению, которое может помочь любому с той же проблемой:

var tree = new TreeModel(); 
var root = tree.parse({ 
    id: 0, 
    name: "Root", 
    children: [{id: 1, name: "1", children: []},{id: 2, name: "2", children: []}] 
}); 

console.log(root) 
var dup = tree.parse(root.model) 
console.log(dup) 

parse функция принимает в качестве параметра модели и модель корня, кажется, работает хорошо.

EDIT: это решение может привести к несоответствиям, поскольку два дерева основаны на одной и той же модели. Решение JNS более подходит.

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

  • Нет связанных вопросов^_^