为什么在ActionScript中迭代通用对象会给我值而不是键?

时间:2012-05-02 09:45:23

标签: actionscript-3 dictionary

我可能正在做一些非常愚蠢的事情,但我不明白为什么下面的代码不起作用......

在这里,我创建了一个名为spellbook的通用对象:

// A list of all the player's spells
public var spellBook:Object = {};

在这里,我将一个键值对添加到法术书中:

spellBook["bubble"] = new BubbleSpell(spellBook);

在这里我尝试输出法术书的内容:

trace("Spells initialised.  Available spells are:");
for each (var _spell:String in spellBook)
{
    trace("  ", _spell, " : ", spellBook[_spell]);
}

但这是我得到的输出:

Spells initialised.  Available spells are:
   [object BubbleSpell]  :  undefined

我没有得到的是为什么它没有输出:

Spells initialised.  Available spells are:
   bubble : [object BubbleSpell]

...

就好像我正在迭代法术书中的值,而不是键......是发生了什么?到目前为止我看到的所有文档似乎都表明这是迭代字典的正确方法(通用对象的类型是......)我是否需要调用方法来获取键而不是泛型的值对象

太困惑了!

2 个答案:

答案 0 :(得分:6)

for each用于迭代值,你想使用迭代键的for循环,例如:

var mySpells = { 
    speedy: new SpeedySpell(),
    sleepy: new SleepySpell()
};

for (var key : String in mySpells) {
    trace("key: " + key + " value: " + mySpells[key]);
}

请注意,当迭代Dictionary中的键时,您应该将key值保留为无类型(*),因为词典的键可以是任何类型(而{{1}密钥只能是Object)类型。

一个常见的技巧是创建一个实用程序函数,它将对象的键提取到String以便更容易迭代:

Array

然后,您可以使用此辅助函数:

function getKeys(source : Object) : Array {
    const result : Array = [];
    for (var key : * in source) {
        result.push(key);
    }
    return result;
}

答案 1 :(得分:4)

因为你正在使用for each循环。改为使用for循环:

for (var key:* in spellBook) {
    trace(key + ': ' + spellBook[key]);
}