2011-11-18 42 views
7

我發現使用參考方法來處理ActionScript的數組賦值並不熟悉。我明白它在做什麼,但我總覺得用這種方法管理許多陣列會讓人困惑。是否有一種簡單的方法來處理數組賦值爲VALUE而不是REFERENCE的ActionScript數組?例如,如果我想將oneArray指定爲twoArray而未將這兩個數組永久鏈接到對方,那該怎麼做?這會工作嗎?ActionScript:如何通過VALUE而不是REFERENCE分配數組?

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. 

回答

5

您可以克隆的陣列,以保證兩個不同的副本在每個數組元素相同的價值觀:

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

希望這是你正在尋找的。

+0

只是注意到了taskinoor的回答,爲了追求你朝着我的方向發展,嘿嘿,在克隆數組方面,'concat'實際上是'slice'的兩倍。 :) – xLite

+1

謝謝!我研究了一下,發現了一些支持你的主張的鏈接。這裏是一個:http://agit8.turbulent.ca/bwp/2008/08/flash-as3-optimization-fastest-way-to-copy-an-array/ – ggkmath

+1

這隻會做一個淺拷貝。對於數組的深層副本,您必須使用ByteArray來克隆AS3中的陣列:http://help.adobe。COM/EN_US/ActionScript中/ 3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7ee7.html – TheDarkIn1978

10

看起來你正在尋找slice方法。它返回一個由原始數組中一系列元素組成的新數組。

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

編輯:請注意,切片做一個淺拷貝,而不是深層複製。如果您正在查找深層複印件,請按照評論中指定的鏈接進行操作。

+5

這裏是深克隆 http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7ee7.html –

+0

@約翰Giotta,感謝您的鏈接的一些信息。我編輯了答案。 – taskinoor

+0

感謝您的回答,特別是淺層與深層克隆之間的區別(我不知道)。 – ggkmath

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

您可以創建一個克隆的功能來複制使用ByteArray.writeObject再出使用ByteArray.readObject新對象的對象,如livedocs.adobe.com描述 - Cloning arrays

請注意,writeObjectreadObject不會理解比ObjectArray更復雜的對象。

相關問題