0

我有一个对象数组,它使用分隔字符串作为键。在 FB4 调试器中检查时,键如下所示:

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

前两项是数字(转换为字符串),但多部分分隔键中的第三项自然是字符串——它就像一个字母数字库架参考。正如预期的那样,当您单击调试器中的 [+] 图标时,您可以查看与该字符串键关联的对象。到现在为止还挺好。

调试器按(预排序)将键添加到数组中的顺序显示键。但是,当迭代对象数组时:

    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 回答