0

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

在这里,我创建了一个名为 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]

??

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

如此迷茫!

4

2 回答 2

6

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

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

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

请注意,在迭代 a 中的键时,Dictionary您应该将key值保留为 untyped ( *),因为 Dictionary 的键可以是任何类型(而Object的键只能是 type String)。

一个常见的技巧是创建一个实用函数,该函数将对象的键提取到一个Array更容易的迭代中:

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

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

trace(getKeys(mySpells));
于 2012-05-02T09:49:17.550 回答
4

因为您使用的是for each循环。改用for循环:

for (var key:* in spellBook) {
    trace(key + ': ' + spellBook[key]);
}
于 2012-05-02T09:49:01.263 回答