PDA

Просмотр полной версии : Клонирование Object


bettrrr
03.09.2007, 19:30
Есть дерево объектов, которое получено в результате парсинга XML.
Дерево неопределённой структуры.
node1.node2.....nodeX
node1.nodeA.....nodeY
Неопределённое количество ветвей и узлов.

Вне надо клонировать одну ветвь, что-то вроде:
tmp = node1.node2;

Нужен именно дубликат, т.к. с самим деревом будут производиться трансформации.

Всё написано на AS2.

Подскажите, как сделать клон объекта/ветви?

silin
03.09.2007, 23:45
var xml:XML =
<tree>
<item>
<val>init</val>
</item>
<item />
</tree>;
var node:XMLList=new XMLList(xml.item[0]);
var nodeCopy:XMLList=node.copy();
node.val="changed";
trace("node:"+node);
trace("nodeCopy: "+nodeCopy);

bettrrr
04.09.2007, 15:21
var xml:XML =
<tree>
<item>
<val>init</val>
</item>
<item />
</tree>;
var node:XMLList=new XMLList(xml.item[0]);
var nodeCopy:XMLList=node.copy();
node.val="changed";
trace("node:"+node);
trace("nodeCopy: "+nodeCopy);
нет, делево получено в результате моего парсинга и оно не является объектом класса XML

Зря я написал про XML.

Это просто дерево объектов, неопределённой структуры, вида

-----------obj--------------
| | |.....
obj2 obj4
| |
obj3 ----obj5-----
| | |
objX objY objZ

Структура произвольная.
И мне надо скопировать одну из ветвей (например obj5)

bettrrr
04.09.2007, 15:24
и ещё, специально отдельным сообщением для модератора:

я ошибся в первом посте, когда написал про AS3, это опечатка! Скрипт на AS2

silin
04.09.2007, 16:48
'только не в лотерею, а в карты, не машину а сто рублей, и не выиграл, а проиграл..':)
только не AS3 и не XML..
тогда можно рекурсией обойти нод, как-то так:
function cloneObj(obj){
var clone={};
var cont=0;
for( var i in obj){
clone[i]=cloneObj(obj[i]);
cont++;
}
return cont ? clone : obj;
}

var tree={node1:{node11:{node111:111,node112:112},node12:12},node2:{node22:22}};
var node=tree.node1;
nodeCopy=cloneObj(node);
node.node11.node111="XXX";
trace(nodeCopy.node11.node111);//111

bettrrr
04.09.2007, 17:37
'только не в лотерею, а в карты, не машину а сто рублей, и не выиграл, а проиграл..':)
только не AS3 и не XML..
тогда можно рекурсией обойти нод, как-то так:
function cloneObj(obj){
var clone={};
var cont=0;
for( var i in obj){
clone[i]=cloneObj(obj[i]);
cont++;
}
return cont ? clone : obj;
}

var tree={node1:{node11:{node111:111,node112:112},node12:12},node2:{node22:22}};
var node=tree.node1;
nodeCopy=cloneObj(node);
node.node11.node111="XXX";
trace(nodeCopy.node11.node111);//111
Блин, рекурсией - это через... неправильно это, темболее, что дерево строится рекурсией и пробегать по нему ещё несколько раз это расточительно.
неужели в языке, который претендует на роль объектно-ориентированного языка нет механизма клонирования объектов???

silin
04.09.2007, 18:26
темболее, что дерево строится рекурсией и пробегать по нему ещё..
что мешает строить сразу и клоны..
неужели в языке, который претендует на роль объектно-ориентированного языка нет..
похоже, что ты не зря пришел в раздел AS3 и описался с XML.., ты на пути к языку, который претендует.. и правильному его использованию..:)

bettrrr
06.09.2007, 15:01
что мешает строить сразу и клоны..
Я могу узнать, нужны ли клоны, только во время построения дерева (потом уже поздно), но для этого мне придётся внутри рекурсивного вызова функции вызывать другую рекурсивную функцию. :)

Ieshua
13.09.2007, 16:27
Class ObjectUtil
Methods:

copy(value:Object):Object
[static] Copies the specified Object and returns a reference to the copy.


copyright (http://riapriority.com/blogs/agahov.php?cat=41)

but only for flex project :(

etc
13.09.2007, 19:36
Чего прикажете с темой делать? Двигать отсюдова или оставить? Вот, честно, я не знаю, чего с ней делать.
В следующий раз выбирайте разделы правильно.

RetKiller
20.03.2009, 15:44
Никакого отношения именно в AS3 тема,по-моему скромному мнению,не имеет...

рекурсией - это через... неправильно это,
У вас и дерево "через ..." построено,и клон "через ..." сделаете. Полный клон :D

Чем вам так рекурсия не мила?

iNils
20.03.2009, 17:05
Вы на даты сообщений смотрели?