AS3 Flex中的排序对象/地图?

时间:2014-12-27 15:10:50

标签: actionscript-3 flash flex object dictionary

是否可以在Actionscript 3 Flex中的对象中对对象进行排序或具有某种顺序?我有一个像这样创建的对象:

private var data:Object = new Object();

然后我继续将一些键和值放入其中:

this.data.someKeyOne = 0;
this.data.someKeyTwo = 1337;
this.data.someKeyThree = 123;

之后我遍历对象:

for (var dataPart:String in this.data) {
    trace("Key: " + dataPart = " Value:" + this.data["dataPart"]);
}

但我的问题是数据不会按照我初始化的顺序显示。这是令人沮丧的,因为它需要处于初始化的顺序。

2 个答案:

答案 0 :(得分:4)

正如@helloflash在his answer中所说的关于循环对象,并根据Adobe's definition of associative array(这是Object类的一个实例):

  

关联数组(有时称为散列或映射)使用键而不是数字索引来组织存储的值。关联数组中的每个键都是一个唯一的字符串,用于访问存储的值。关联数组是Object类的实例,这意味着每个键对应一个属性名称。关联数组是键和值对的无序集合。您的代码不应期望关联数组的键按特定顺序排列。

你得到的行为是正常的,你不能在你的情况下得到有序的键(使用像这样的对象)。

如果您不需要密钥,您可以使用简单的数组或向量在his answer中的@helloflash中进行操作。否则,您可以使用对象数组,如下所示:

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

或者您可以使用Object,然后将其排序为数组,如下所示:

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

希望所有可以帮到你的事。

答案 1 :(得分:1)

关于looping的Adobe帮助:

  

for..in循环遍历对象的属性,或者   数组的元素。例如,您可以使用for..in循环   遍历通用对象的属性(对象属性)   不按任何特定顺序保留,因此属性可能出现在   看似随意的顺序)

<强>结论

如果您希望按键显示顺序,则必须使用Array(或Vector):

var myArray:Array = [0, 1337, 123];

for (var i:String in myArray) {
    trace(myArray[i]);
}
// output: 0, 1337, 123