2009-03-06 6 views
13

Me gustaría saber el orden de iteración para los tipos de matriz, diccionario y objeto en AS3, para los bucles for-each y for-in. Además, ¿qué factores pueden cambiar el orden de iteración de estas combinaciones de tipo de bucle?For-Each Loop AS3: ¿Está garantizada la dirección?

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

+0

+1. Muy buena pregunta, ¿cuáles son tus observaciones? ¡Soy curioso! – dirkgently

+1

Es una buena idea fundamental eh :) Tuve un error en el proyecto hace un tiempo, que tracé a una matriz que se revirtió o el para cada uno se movía hacia atrás. Reemplacé el for-each con un ++ lopp for-index y el error desapareció. Nunca en realidad estuve 100% seguro de cuál era la causa. –

Respuesta

5

¿Te refieres al tipo de for-each loop for (x in y)? La especificación AS3 dice que para los bucles "tienen la misma sintaxis y semántica que las definidas en ECMA-262 edición 3 y E4X".

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

lo haría esperanza de que la documentación para la mayoría de las colecciones indicarán explícitamente el orden de enumeración (o que la orden no se define), pero no lo he comprobado ...

EDIT: por desgracia, el estado de las especificaciones que "la mecánica de enumerar las propiedades [...] depende de la implementación". No puedo ver nada en los documentos de Array para especificar el orden. Es un poco insatisfactorio, para ser honesto :(

+0

Gracias Jon, acabo de hacer la pregunta más específica en función de tu respuesta –

+1

He reformulado por completo la pregunta, creo que está bastante claro ahora :) –

+1

Gracias por la edición de Jon, ciertamente no es satisfactorio que no esté especificado en la documentación. Voy a echar un vistazo a la documentación específica de AS3 en este –

2

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, todo bucle mantiene el orden array Prueba el fragmento:.

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

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

Prueba el anterior con AS3.0 y AS1.0/2,0

+0

La pregunta es si este código produce la misma salida para diferentes tiempos de ejecución de Flash. – Pup

8

Como se indica en Actionscript esencial 3,0 por Colin Moock, el orden de una para cada bucle in no se garantiza a menos que se enumere un objeto XML o XMLList;

Click here for Colin Moock's words from his book.

hay soluciones como discutido here, pero sinceramente si es necesario para garantizar el orden y luego sólo tiene que utilizar una vieja regular para bucle y tenerlo iterar varias veces (longitud, numChildren, etc.).

+0

¿Hay alguna razón particular por la que usted sabe que la orden no está garantizada? Puedo entender porque una matriz puede tener una indexación no numérica. Lo que me lleva a preguntarme ... ¿seguramente un Vector. <> Tiene un orden garantizado ya que se almacena secuencialmente en la memoria? –

+0

Como dije anteriormente, Colin Moock cubrió esto en detalle, no dude en seguir el enlace de arriba que se toma directamente de su libro. -Cheers –

+2

Para ser sincero, me siento bastante incómodo con esa afirmación si no se da ninguna razón. No es que crea que sea falso, pero que no hay lógica o razonamiento detrás de esto (muy probablemente debido a la edición).Estoy interesado en la mecánica interna de por qué un bucle no puede garantizar el orden en un Array. –

Cuestiones relacionadas