我可能正在做一些非常愚蠢的事情,但我不明白为什么下面的代码不起作用......
在这里,我创建了一个名为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]
...
就好像我正在迭代法术书中的值,而不是键......是发生了什么?到目前为止我看到的所有文档似乎都表明这是迭代字典的正确方法(通用对象的类型是......)我是否需要调用方法来获取键而不是泛型的值对象
太困惑了!
答案 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]);
}