ActionScript:如何通过VALUE而不是REFERENCE分配数组?

时间:2011-11-18 17:14:04

标签: actionscript-3 flex actionscript

我发现通过参考方法使用ActionScript的数组赋值并不熟悉。我理解它在做什么,但我发现用这种方法管理很多数组会让人感到困惑。是否有一种简单的方法来处理ActionScript数组,其中数组赋值是通过VALUE而不是REFERENCE?例如,如果我想将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 个答案:

答案 0 :(得分:11)

看起来您正在寻找slice方法。它返回一个新数组,该数组由原始数组中的一系列元素组成。

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

编辑:请注意,切片执行浅拷贝,而不是深拷贝。如果您正在寻找深层副本,请按照评论中指定的链接进行操作。

答案 1 :(得分:5)

您可以克隆数组以保证每个Array元素中具有相同值的两个单独副本:

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

希望这是你正在寻找的。

答案 2 :(得分:0)

如果我正确理解了这个问题,你可以这样做:

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());

答案 3 :(得分:-2)

您可以使用ByteArray.writeObject创建克隆功能以使用ByteArray.readObject复制对象,然后使用writeObject创建新对象,如 livedocs.adobe.com 中所述 - Cloning arrays

请注意,readObjectObject无法理解比Array和{{1}}更复杂的对象。