Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Связывание массивов (http://www.flasher.ru/forum/showthread.php?t=144909)

Avrilka 24.09.2010 08:50

Связывание массивов
 
У меня есть 2 объекта. Они грубо говоря забирают из _root массив ATR.

в них написанно

var A:Array = _root.ATR

анологично во 2 ом объекте.

Получается такая штука что когда я допустим в одном объекте в массиве A меняю значение A[x]['hjdsfhsdhf']=1. ТО в _root.ATR меняется значение тоже на 1. :wacko:

udaaff 24.09.2010 09:53

Сложные типы передаются по ссылке, а не по значению.

Psycho Tiger 24.09.2010 11:17

Код AS1/AS2:

var A:Array = _root.ATR.slice();


gfdrf 24.09.2010 11:23

Вот уж никак не думал, что вопрос в который я уперся вчера, сегодня поднимется на форуме.
По сути понятно, а вот как избавится от этого?
А у меня это всё идет ещё и глубже. Приведу свой пример:
Есть некий клип-редактор.
Есть главный массив в котором куча элементов.
Этот главный массив, сохраняется в шареде.
То есть типа так:
Код AS1/AS2:

save.data.mainData=mainArray

Для редактирования, берем элемент из главного массива, например mainArray[1] и
делаем так:
Код AS1/AS2:

editorMC.array0=mainArray[1][0]
editorMC.array1=mainArray[1][1]
editorMC.array2=mainArray[1][2]

Затем, используя значения из массивов editorMC.array0...editorMC.array(X)
выполняем в клипе редакторе некие действия.
А дальше начинается проблема:
Мы что то изменяем в редакторе, и затем, мы хотим либо сохранить изменения, либо нет. Так вот не проходит такая фишка, ибо (в дебаггере замечательно видно), как только мы изменяем что то в этих дочерних массивах editorMC.array0...editorMC.array(X), то изменения сразу происходят не только в главном массиве, а и даже и в save.data.mainData.
Пробовал сделать так:
Сохранять данные из редактируемого элемента (перед редактированием), во временном массиве, и если не нужны изменения, восстанавливать данные из него.
Прикол в том, что в нем данные точно так же изменяются, синхронно с остальными :)
Как это победить?

Добавлено через 1 минуту
Упс, пока писал ответ уже есть :)
Спасибо попробую. Я тоже подумал, что нужно использовать не простое приравнивание, а что то из других методов.

fljot 24.09.2010 14:59

Разве concat() не быстрее считается?

Avrilka 02.10.2010 19:59

Попробовал так:

Код AS1/AS2:

onClipEvent(load) {
        var ATR = _root.ATRB.slice()
        trace ('M1:'+ATR[0]['ATTACK_MAX'])
        trace ('R:'+_root.ATRB[0]['ATTACK_MAX'])
        ATR[0]['ATTACK_MAX'] = 10;
        trace ('M1:'+ATR[0]['ATTACK_MAX'])
        trace ('R:'+_root.ATRB[0]['ATTACK_MAX'])
}

Код:

M1:1100
R:1100
M1:10
R:10

ЗЫ: Знаю что писать в объектах не желательно. Просто для теста.

Должно быть:

Код:

M1:1100
R:1100
M1:10
R:1100


Psycho Tiger 02.10.2010 20:03

Вы сказали массив, а на деле у Вас хэш. Как вариант напишите свой clone, на базе for in.

Avrilka 02.10.2010 20:05

Я ненастолько продвинут )
Цитата:

Как вариант напишите свой clone, на базе for in.
- что это значит?

Добавлено через 8 минут
Через циклы передачу осуществлять?

Добавлено через 51 час 39 минут
Разобрался со всем


Часовой пояс GMT +4, время: 03:19.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.