2009-09-25 11 views
13

Estoy escribiendo una aplicación en Flex/ActionScript y tengo una serie de variables miembro de clase de tipo Array que almacena datos.¿La mejor manera de eliminar todos los elementos de una matriz de ActionScript?

Mi pregunta es: ¿cuál es la "mejor" forma de limpiar un objeto Array?

Me di cuenta de que la clase ArrayCollection tiene una función removeAll() que hace esto, pero la clase Array básica no. Algunas de las posibilidades que he consideradas son:

  • Iterar a través de la matriz, llamando pop o cambiar en cada elemento
  • Ajuste de la longitud de la matriz a 0
  • establecer la variable de miembro a un "new Array()" o "[]"

Respuesta

15

yo diría:

myArray = [ ]; 

Eso es explícita, corta, y hace buen uso de la basura de la máquina virtual coleccionista

Su primera alternativa ejecuta una gran cantidad de código interpretado para obtener el mismo resultado.

No sé si el segundo hace lo que quiere; si lo hace, es hacky, no está claro.

La "nueva variante de Array()" de la tercera alternativa es muy prolija, sin ofrecer ninguna ventaja sobre una matriz literal. Si también escribe JS y usa JSLint, se le gritará por no usar el formulario literal de la matriz.

+3

Conjunto longitud = 0 no es hacky como lo mencionó el oficial as3 lang ref: http://help.adobe.com/en_US/AS3LCR/Flash_10.0/Array.html#length. Yo personalmente uso este método también. Y estoy de acuerdo con Christopher W. Allen-Poole en que su método no está borrando la matriz en realidad. –

+0

myArray.length = 0 es más claro en el sentido de que introduce un componente innecesariamente descriptivo de la matriz cuando todo lo que debe transmitirse al lector es "eliminar matriz". La característica de truncamiento del organizador de la longitud inicialmente me pareció una especie de bonificación adicional. De todos modos, la respuesta de Christopher W. Allen-Poole (cwallenpoole) tiene mucho sentido y parece un poco más aparente ya que la operación de "empalme" es más literal y está diseñada específicamente para * eliminar * elementos. – Pup

8

Depende de su contexto. Durante el uso de la respuesta del Sr. Young es a menudo la forma más correcta de hacer las cosas, no siempre funciona, especialmente si usted tiene dos variables que apuntan a la misma matriz:

var foo:Array 
var bar:Array 
foo = bar = [ 1, 2, 3 ]; 
bar = []; 
trace(foo); // 1,2,3 

Por otro lado, si realmente vacía la matriz de forma manual:

var foo:Array 
var bar:Array 
foo = bar = [ 1, 2, 3 ]; 
var l:int = bar.length; // get the length FIRST! 
         // Otherwise bar.length will change 
         // while you iterate! 

for(var i:int = 0; i < l; i++) 
{ 
    bar.shift(); 
} 
trace(foo); // does not trace anything 
+1

while (bar.length> 0) bar.shift(); // :) –

+5

bar.splice (0); // No se necesita ningún bucle :) –

7

Si se puede modificar la referencia de matriz, entonces yo iría con la respuesta de Warren. Si necesita modificar la instancia existente, también se puede utilizar Array.splice:

var arr : Array = [1, 2, 3, 4, 5]; 

arr.splice(0, arr.length); 
+1

arr.splice (0); o mejor: arr.length = 0; –

14

Me temo que decir, pero Warren Young es equivocado cuando dijo que el establecimiento de la myArray = [] hacer que el recolector de basura para recoger la matriz

ya que tiene la capacidad de agregar una referencia a sí mismo dentro de sí mismo, y por lo tanto nunca se recolectará y usará memoria, especialmente si la matriz tiene algunos Sprites en la matriz, ya que ellos también la harían referencia y ellos tampoco serían recogidos.

Sly_cardinal y Richard Szalay son 100% correctos. pero el parámetro de longitud no es necesario en Richard's.

Para totalmente clara la matriz y asegúrese de que su recogida por la basura y luego

myArray.splice(0); 
myArray = null; 
1

Según this test la forma mejor es establecer longitud = 0

Cuestiones relacionadas