0

区切られた文字列をキーとして使用するオブジェクトの配列があります。FB4 デバッガーで調べると、キーは次のようになります。

   [+] 22477◦25220◦20.1
   [+] 22477◦25220◦20.6
   [+] 22477◦25220◦20.8
   [+] 22477◦25244◦55.1K(j)

最初の 2 つの項目は数値 (文字列にキャスト) ですが、マルチパート区切りキーの 3 番目の項目は当然文字列です。これは、英数字のライブラリ シェルフ リファレンスのようなものです。予想どおり、デバッガーの [+] アイコンをクリックすると、その文字列キーに関連付けられたオブジェクトを表示できます。ここまでは順調ですね。

デバッガーは、キーが配列に追加された (事前に並べ替えられた) 順序でキーを表示します。ただし、オブジェクト配列を反復する場合は次のようになります。

    for (var key: MyAssociativeArray の文字列){
          // キーは、デバッガーによって表示される順序ではありません
    }

キーは別の順序で返されます -- 内部ハッシュ? 私の質問は、キーが追加された順序をデバッガーがどのように認識し、配列を反復するときに実行時にその知識にアクセスできるかということです。追加された順序でオブジェクトを反復処理したい。または、連想配列に追加された順序を示すこれらのキーの独自のインデックスを維持する必要がありますか?

   [0] 22477◦25220◦20.1
   [1] 22477◦25220◦20.6
   [2] 22477◦25220◦20.8
   [3] 22477◦25244◦55.1K(j)

ありがとう

4

1 に答える 1

2

デバッガーは、探しているものを見つけやすくするために、連想配列内の項目のリストを辞書順 (数字順およびアルファベット順) に並べ替えます。あなたの例のリストはこのようにソートされています。同じ順序で連想配列に項目を追加したのは偶然です。

追加のメタデータを作成せずに、アイテムを連想配列に追加する順序を見つける方法はありません。このような動作が必要な場合は、このためのカスタム クラスを作成してみてください。

次に例を示します。

import flash.utils.Dictionary;
import flash.utils.Proxy;
import flash.utils.flash_proxy;


dynamic class OrderedAssoArray extends Proxy{
    private var _items:Dictionary = new Dictionary();
    private var _idx:Array = new Array();
    use namespace flash_proxy
    override flash_proxy function setProperty(name:*, value:*):void {       
        _items[name] = value;
        _idx.push(name);
    }
    override flash_proxy function getProperty(name:*) : *{      
        return _items[name];
    }
    override flash_proxy function nextNameIndex (index:int):int {       
        return index < _idx.length ? index + 1 : 0;     
    }
    override flash_proxy function nextName(index:int):String {      
        return _idx[index-1];
    }
    override flash_proxy function nextValue(index:int):* {      
        return _items[_idx[index -1]];
    }
}

上記を使用すると、次のようなことができます。

        var assoArray:Object = new OrderedAssoArray();
        assoArray["key_one"] = "value_one"          
        assoArray["key_two"] = "value_two"
        assoArray["key_three"] = "value_three"
        assoArray["key_four"] = "value_four"
        for each(var item:String in assoArray){
            trace(item)
        }
于 2010-02-04T15:58:02.313 に答える