ActionScript: Как назначить массивы по значению, а не по ссылке? - PullRequest
8 голосов
/ 18 ноября 2011

Мне незнакомо работать с назначением массивов в ActionScript по ссылочной методологии.Я понимаю, что он делает, но мне почему-то кажется странным управлять многими массивами с помощью этой методологии.Есть ли простой способ работы с массивами ActionScript, где массив назначается по значению, а не по ссылке?Например, если я хочу присвоить oneArray значению twoArray без привязки двух массивов друг к другу навсегда в будущем, как это сделать?Будет ли это работать?

var oneArray:Array = new Array("a", "b", "c");
var twoArray:Array(3);
for (ii=0; ii<3; ii++) { twoArray[ii] = oneArray[ii]; }

Намерение состоит в том, чтобы иметь возможность изменить twoArray, не видя изменений в oneArray.

Любой совет, как назначать массивы по VALUE вместо REFERENCE?

---- для справки ----

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/Array.html

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

var oneArray:Array = new Array("a", "b", "c");
var twoArray:Array = oneArray; // Both array variables refer to the same array.
twoArray[0] = "z";             
trace(oneArray);               // Output: z,b,c.

Ответы [ 4 ]

11 голосов
/ 18 ноября 2011

Похоже, вы ищете ломтик метод.Он возвращает новый массив, который состоит из диапазона элементов из исходного массива.

var oneArray:Array = new Array("a", "b", "c");
var twoArray:Array = oneArray.slice();
twoArray[0] = "z";             
trace(oneArray);  

РЕДАКТИРОВАТЬ: обратите внимание, что срез делает копирование мелким, а не глубокое копирование.Если вы ищете глубокую копию, перейдите по ссылке, указанной в комментарии.

5 голосов
/ 18 ноября 2011

Вы можете клонировать массив, чтобы гарантировать две отдельные копии с одинаковыми значениями в каждом элементе Array:

var oneArray:Array = new Array("a", "b", "c");
var twoArray:Array = oneArray.concat();
twoArray[0] = "z";
trace(oneArray); // Output: a,b,c

Надеюсь, это то, что вы ищете.

0 голосов
/ 13 июля 2012

Вы можете создать функцию клонирования, чтобы копировать объект с помощью ByteArray.writeObject и затем на новый объект с помощью ByteArray.readObject, как описано в aliveocs.adobe.com - Клонирование массивов.

Обратите внимание, что writeObject и readObject не будут понимать объекты более сложные, чем Object и Array.

0 голосов
/ 18 ноября 2011

Если я правильно понял вопрос, вы можете сделать это:

var collection= new ArrayCollection(["a", "b", "c"]);
var clonedCollection = new ArrayCollection(ObjectUtil.copy(collection.source) as Array);

// a, b, c
trace(collection.toString());
// a, b, c
trace(clonedCollection .toString());

clonedCollection.removeItemAt(0);

// a, b, c
trace(collection.toString());
// b, c
trace(clonedCollection .toString());
...