2011-11-18 10 views
7

Trovo poco familiare lavorare con l'assegnazione di array di ActionScript tramite la metodologia di riferimento. Capisco cosa sta facendo, ma in qualche modo trovo confuso gestire molti array con questa metodologia. Esiste un modo semplice per lavorare con gli array ActionScript in cui l'assegnazione dell'array è VALUE anziché REFERENCE? Ad esempio, se voglio assegnare oneArray a twoArray senza collegare i due array l'uno all'altro per sempre in futuro, come farlo? Funzionerebbe?ActionScript: come assegnare gli array in base a VALUE anziché REFERENCE?

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

L'intento è quello di essere in grado di cambiare twoArray senza vedere un cambiamento nella oneArray.

Qualche consiglio su come assegnare gli array in base a VALUE anziché REFERENCE?

---- per riferimento ----

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

assegnazione all'array avviene in riferimento anziché al valore. Quando si assegna una variabile di array a un'altra variabile di array, entrambe si riferiscono allo stesso array:

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. 

risposta

5

è possibile clonare la matrice di garantire due copie separate con gli stessi valori in ogni elemento dell'array:

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

Speranza questo è quello che stai cercando.

+0

Ho appena notato la risposta di taskinoor, per inseguirti verso la mia direzione, hehe, 'concat' è in realtà il doppio più veloce di' slice' in termini di clonazione di una matrice. :) – xLite

+1

Grazie! Ho studiato un po 'e ho trovato alcuni link a supporto del tuo reclamo. Eccone uno: http://agit8.turbulent.ca/bwp/2008/08/flash-as3-optimization-fastest-way-to-copy-an-array/ – ggkmath

+1

questo farà solo una copia superficiale. per una copia profonda di un array è necessario utilizzare ByteArray per gli array di clonazione in AS3: http: //help.adobe.com/it_IT/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7ee7.html – TheDarkIn1978

10

Sembra che siete alla ricerca di slice metodo. Restituisce un nuovo array che consiste in un intervallo di elementi dall'array originale.

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

MODIFICA: nota che la porzione fa una copia poco profonda, non una copia profonda. Se stai cercando una copia approfondita, segui il link specificato nel commento.

+5

ecco alcune informazioni sul profondo clonazione http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7ee7.html –

+0

@ John Giotta, grazie per il link. Ho modificato la risposta. – taskinoor

+0

Grazie per la risposta, e soprattutto la differenza tra la clonazione superficiale e quella profonda (non ne avevo idea). – ggkmath

0

Se ho capito bene la domanda, si potrebbe fare questo:

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

è possibile creare una funzione di clone per copiare l'oggetto utilizzando il ByteArray.writeObject e poi fuori a un nuovo oggetto utilizzando ByteArray.readObject, come descritto nella livedocs.adobe.com - Cloning arrays.

Nota che writeObject e readObject non comprendono gli oggetti più complessi di Object e Array.