actionscript-3 - descargar - array as3
Objeto ordenado/mapa en AS3 Flex? (2)
¿Es posible ordenar un objeto o tener algún tipo de orden en un objeto en Actionscript 3 Flex? Tengo un objeto que se crea así:
private var data:Object = new Object();
Luego paso a ponerle algunas claves y valores:
this.data.someKeyOne = 0;
this.data.someKeyTwo = 1337;
this.data.someKeyThree = 123;
Después de eso, recorro el objeto:
for (var dataPart:String in this.data) {
trace("Key: " + dataPart = " Value:" + this.data["dataPart"]);
}
Pero mi problema es que los datos no se mostrarán en el orden en que los inicialicé. Esto es frustrante, ya que se requiere que esté en el orden inicializado.
Ayuda de Adobe sobre bucle :
El bucle for..in itera a través de las propiedades de un objeto o los elementos de una matriz. Por ejemplo, puede usar un ciclo for..in para recorrer las propiedades de un objeto genérico (las propiedades del objeto no se mantienen en un orden particular, por lo que las propiedades pueden aparecer en un orden aparentemente aleatorio)
Conclusión
Si desea que sus claves aparezcan en orden, debe usar una Array
(o un Vector
):
var myArray:Array = [0, 1337, 123];
for (var i:String in myArray) {
trace(myArray[i]);
}
// output: 0, 1337, 123
Como dijo @helloflash en su respuesta sobre el bucle a través de un objeto, y de acuerdo con la definición de associative array
Adobe (que es una instancia de la clase Object):
Una matriz asociativa, a veces llamada hash o mapa, usa claves en lugar de un índice numérico para organizar los valores almacenados. Cada clave en una matriz asociativa es una cadena única que se utiliza para acceder a un valor almacenado. Una matriz asociativa es una instancia de la clase Object, lo que significa que cada clave corresponde a un nombre de propiedad. Las matrices asociativas son colecciones desordenadas de pares clave y valor. Su código no debe esperar que las claves de una matriz asociativa estén en un orden específico.
El comportamiento que tienes es normal y no puedes obtener las claves ordenadas en tu caso (usando un Objeto como ese).
Si no necesita claves, puede hacer lo que @helloflash dijo en su respuesta , usando un simple Array o Vector. De lo contrario, puede usar una matriz de objetos, como esta:
var obj:Object, i:int, s:String;
var data_array:Array = [
{key: ''someKeyOne'', value: 0},
{key: ''someKeyTwo'', value: 1337},
{key: ''someKeyThree'', value: 123}
]
for(i = 0; i < data_array.length; i++){
obj = data_array[i];
trace(''Key : '' + obj.key + '', Value = '' + obj.value);
}
for (s in data_array) {
obj = data_array[s];
trace(''Key : '' + obj.key + '', Value = '' + obj.value);
}
for each (obj in data_array){
trace(''Key : '' + obj.key + '', Value = '' + obj.value);
}
// all these 3 loops give :
// Key : someKeyOne, Value = 0
// Key : someKeyTwo, Value = 1337
// Key : someKeyThree, Value = 123
O puede usar Object y luego ordenarlo en una matriz como esta:
var data_object:Object = new Object();
data_object.someKeyOne = {index:0, value: 0};
data_object.someKeyTwo = {index:1, value: 1337};
data_object.someKeyThree = {index:2, value: 123};
var tmp_array:Array = sort_obj(data_object);
for(i = 0; i < tmp_array.length; i++){
obj = tmp_array[i];
trace(''Key : '' + obj.key + '', Value = '' + obj.value);
}
for (obj in tmp_array) {
obj = tmp_array[obj];
trace(''Key : '' + obj.key + '', Value = '' + obj.value);
}
for each (obj in tmp_array){
trace(''Key : '' + obj.key + '', Value = '' + obj.value);
}
function sort_obj(obj:Object):Array {
var a:Array = [];
for (var key:String in obj) {
a.push({key: key, index: obj[key].index, value: obj[key].value});
}
a.sortOn(''index'', Array.NUMERIC);
return a;
}
// all these 3 loops give :
// Key : someKeyOne, Value = 0
// Key : someKeyTwo, Value = 1337
// Key : someKeyThree, Value = 123
Espero todo lo que pueda ayudarte.