Форум 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=121978)

EvilCoder 27.02.2009 20:44

Копирование объектов и массивов
 
Всем доброго времени суток!
Есть такая не очень хорошая вещь. Когда я копирую публичный массив aMyArray1 в aMyArray2, с помощью оператора приравнивания:
Код AS1/AS2:

aMyArray2 = aMyArray1;

А потом изменяю данные в массиве aMyArray2, то эти изменения отражаются и в первом массиве.

В своих проектах я решаю эту проблему следующим образом:

Код AS1/AS2:

function copyArray(aSource:Array):Array
{
        var aTemp:Array = Array();
        var nCnt:Number = aSource.length;
 
        for (var i = 0; i < nCnt; i++)
        {
                if (aSource[i] instanceof Array)
                {
                        aTemp[i] = copyArray(aSource[i]);
                }
                else if (aSource[i] instanceof Object)
                {
                        aTemp[i] = copyObject(aSource[i]);
                }
                else
                {
                        aTemp.push(aSource[i]);
                }
        }
        return aTemp;
}
function copyObject(oSource:Object)
{
        var oTemp:Object = {};
        for (var i in oSource)
        {
 
                if (oSource[i] instanceof Array)
                {
                        oTemp[i] = copyArray(oSource[i]);
                }
                else
                {
                        oTemp[i] = oSource[i];
                }
        }
        return oTemp;
}

Частое обращение к этим функциям выходит очень ресурсоемким. Я знаю, что при правильной организации кода, можно избежать использование таких обходных путей. Но вот как осуществить эту правильную организацию? Заранее спасибо.

Fatality 27.02.2009 21:01

оО.
Код AS1/AS2:

aMyArray2 = aMyArray1;

Копируете ? Вы создаете ссылку на массив, никакого копирования не происходит. И что это за бред ?.
Код AS1/AS2:

var arr:Array = ["Александр", "Роман", "Виктор"];
var arr1:Array = arr.slice(); // создаем копию массива arr
arr1.push("Дмитрий");
trace(arr); // выводит Александр, Роман, Виктор
trace(arr1); // выводит Александр, Роман, Виктор, Дмитрий


EvilCoder 27.02.2009 22:07

спасибо огромное!
Но как быть с объектами? Или, к примеру, с таким случаем:
Код AS1/AS2:

var arr1:Array = Array(1, Object, 3);
var arr2:Array = Array();
 
 
arr1[1].side = 1;
 
arr2 = arr1.slice();
 
arr2[1].side = 2;
 
trace("Source obj: " + arr1[1].side); //Выводит Source obj: 2
trace("Exit obj: " + arr2[1].side); //Выводит Exit obj: 2

Добавлено через 2 часа 57 минут
Неужели нет никакого способа скопировать весь объект, кроме как копировать все свойства объекта по отдельности?


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

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