2011-11-18 15 views
7

No me resulta familiar trabajar con la asignación de matriz de ActionScript por metodología de referencia. Entiendo lo que está haciendo, pero de alguna manera me resulta confuso administrar muchas matrices con esta metodología. ¿Hay una manera simple de trabajar con matrices de ActionScript donde la asignación de matriz es por VALOR en lugar de REFERENCIA? Por ejemplo, si deseo asignar oneArray a twoArray sin vincular las dos matrices entre sí para siempre en el futuro, ¿cómo hacerlo? ¿Esto funcionaría?ActionScript: cómo asignar matrices por VALOR en lugar de REFERENCIA?

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

La intención es ser capaz de cambiar twoArray sin ver un cambio en oneArray.

¿Algún consejo sobre cómo asignar matrices por VALOR en lugar de REFERENCIA?

---- ---- para la referencia

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

asignación matriz se hace por referencia en lugar de por valor. Cuando se asigna una variable de matriz a otra variable de matriz, ambos se refieren a la misma matriz:

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. 

Respuesta

5

puede clonar la matriz para garantizar dos copias separadas con los mismos valores en cada elemento de la matriz:

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

Esperanza esto es lo que estás buscando.

+0

Acabo de dar cuenta de la respuesta de Taskinoor, para persuadirte hacia mi dirección, jeje, 'concat' es en realidad el doble de rápido que' slice 'en términos de clonación de una matriz. :) – xLite

+1

Gracias! Investigué un poco y encontré algunos enlaces que respaldan tu reclamo. Aquí hay uno: http://agit8.turbulent.ca/bwp/2008/08/flash-as3-optimization-fastest-way-to-copy-an-array/ – ggkmath

+1

esto solo hará una copia superficial. para una copia profunda de una matriz, debe usar ByteArray para clonar matrices en AS3: http: //help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7ee7.html – TheDarkIn1978

10

Parece que busca slice método. Devuelve una nueva matriz que consiste en un rango de elementos de la matriz original.

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

EDIT: Tenga en cuenta que la rebanada hace una copia superficial, no una copia profunda. Si está buscando una copia profunda, siga el enlace especificado en el comentario.

+5

Aquí hay alguna información sobre la clonación profunda http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7ee7.html –

+0

@ John Giotta, gracias por el enlace. He editado la respuesta. – taskinoor

+0

Gracias por responder, y especialmente la diferencia entre la clonación superficial vs profunda (no tenía ni idea). – ggkmath

0

Si entiendo la pregunta correctamente, usted puede hacer esto:

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

Se puede crear una función de la copia para copiar el objeto con la ByteArray.writeObject y luego a un nuevo objeto utilizando ByteArray.readObject, como se describe en livedocs.adobe.com - Cloning arrays.

Tenga en cuenta que writeObject y readObject no comprenderán objetos más complejos que Object y Array.

Cuestiones relacionadas