Pregunta

Me gustaría saber el orden de iteración de los tipos Array, Dictionary y Object en AS3, tanto para los bucles for-each como for-in. Además, ¿qué factores pueden cambiar el orden de iteración de estas combinaciones de tipo de bucle?

Por ejemplo, supongo que usar un for-each en un tipo de Array siempre se mueve del primer elemento al último. Para cada uno no se puede usar en un Diccionario, ¿cómo se determina el orden utilizando un bucle for-in?

¿Fue útil?

Solución

¿Se refiere al tipo para (x en y) de cada bucle? La especificación AS3 dice que para los bucles "tienen la misma sintaxis y semántica como se define en ECMA-262 edición 3 y E4X".

ECMA-262, sección 12.6.4 indica que " el orden de enumeración está definido por el objeto " - en otras palabras, dependerá de si estás iterando a través de una lista, un diccionario, una matriz, etc.

espero que la documentación de la mayoría de las colecciones indique explícitamente el orden de enumeración (o que el orden no esté definido) pero no he revisado ...

EDITAR: Desafortunadamente, las especificaciones establecen que " la mecánica de enumerar las propiedades [...] depende de la implementación. " No puedo ver nada en la documentación de Array para especificar el orden. Es un poco insatisfactorio, para ser honesto :(

Otros consejos

Como se indica en Essential Actionscript 3.0 por Colin Moock, el orden de cada uno de los bucles de entrada no está garantizado a menos que se enumere un objeto XML o XMLList;

Haga clic aquí para ver las palabras de Colin Moock de su libro.

Hay soluciones alternativas como las discutidas aquí , pero honestamente, si necesita garantizar el pedido, simplemente use un bucle for old old y hágalo iterar (longitud, número de niños, etc.) varias veces.

El orden de evaluación cambió en AS3.0 Anteriormente, en AS 1.0 y 2.0, el orden de evaluación se basó en el orden en que se agregaron los objetos. Ahora, en 3.0, todos los bucles mantienen el orden de la matriz. Prueba el fragmento:

var a:Array = new Array();
a[ 1 ] = 'first';
a[ 0 ] = 'second';

for (var key:String in a) 
    trace( key + ': ' + a[ key ] );

Pruebe lo anterior con AS3.0 y AS1.0 / 2.0

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top