2014-12-27 104 views
2

是否可以在Actionscript 3 Flex中對對象進行排序或對某種對象進行排序?我有的像這樣創建的對象:在AS3 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"]); 
} 

但我的問題是,數據將不會顯示在我初始化它們的順序。這是令人沮喪的,因爲它需要在初始化的順序。

+0

https://stackoverflow.com/questions/2892450/sorting-an-array-of-objects-in-actionscript-3 – 2014-12-27 15:28:34

+0

請注意我想要一個可以排序的對象。不是一個排序的對象數組。 – user2932566 2014-12-27 15:30:30

回答

1

Adob​​e幫助約looping:通過對象的屬性,或陣列的 元件

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 
4

如@helloflash在his answer大約循環通過所述一個對象,並且根據Adobe's definition of associative array(這是對象類的一個實例):

關聯數組,有時被稱爲散列或地圖,使用鍵,而不是一個數字索引來組織存儲的值。關聯數組中的每個鍵都是用於訪問存儲值的唯一字符串。關聯數組是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 

或者你可以使用對象,然後整理成一個數組是這樣的:

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 

希望大家可以幫助你。

+0

我猶豫要用(鍵,值)對來喚起關聯數組,但我認爲這不是實質性問題。謝謝akmozo添加這些精度! – helloflash 2014-12-27 18:53:49