为什么这些属性不可枚举?
Why are these properties not enumerable?
我有一个简单的对象对象:
window.abilities = {
migrate:{
name:"Migrate",
description:"Move your tribe to another area; generate all new resources. Takes one time unit.",
image:"migrate.png",
action:"Migrate",
unlocked:true
},
eradicate:{
name:"Eradicate species",
description:"Remove a troublesome plant or animal",
image:"migrate.png",
action:"Eradicate",
unlocked:false
}
}
我正在使用 for ... in ... 循环迭代此对象并生成 UI 个元素:
for(ability in window.abilities){
if(ability.unlocked){
$("#abilities").append(genAbilityCard(ability.name,ability.image,ability.description,ability.action));
}
}
但是,每个能力变量都是空的——它只有键而没有属性(名称、描述等)。这些属性似乎是不可枚举的——尽管以这种方式创建的属性在默认情况下应该是可枚举的!
如何在不使用 Object.defineProperty 或类似笨拙的东西的情况下使这些属性隐式枚举?
尝试使用 for..of
和 Object.values
进行迭代(仅限 ES6):
for (const ability of Object.values(window.abilities)){
if (ability.unlocked){
$("#abilities").append(genAbilityCard(ability.name,ability.image,ability.description,ability.action));
}
}
如果您能够使用 ES6 和 for... of
循环,Alberto 的答案是您最好的选择,也是最干净的选择。
如果您仅限于 ES5,您也可以使用 for ... in
。正如您所发现的,for ... in
仅枚举键(属性 名称),而不是 属性 值,但是一旦您知道 属性 值就很容易属性 姓名:
var abilityName, ability;
for(abilityName in window.abilities){
ability = window.abilities[abilityName];
if(ability.unlocked){
$("#abilities").append(genAbilityCard(ability.name,ability.image,ability.description,ability.action));
}
}
您获得 属性 名称的事实意味着您已成功枚举属性。 Javascript 在 for ... in
的工作方式上有点奇怪。
我有一个简单的对象对象:
window.abilities = {
migrate:{
name:"Migrate",
description:"Move your tribe to another area; generate all new resources. Takes one time unit.",
image:"migrate.png",
action:"Migrate",
unlocked:true
},
eradicate:{
name:"Eradicate species",
description:"Remove a troublesome plant or animal",
image:"migrate.png",
action:"Eradicate",
unlocked:false
}
}
我正在使用 for ... in ... 循环迭代此对象并生成 UI 个元素:
for(ability in window.abilities){
if(ability.unlocked){
$("#abilities").append(genAbilityCard(ability.name,ability.image,ability.description,ability.action));
}
}
但是,每个能力变量都是空的——它只有键而没有属性(名称、描述等)。这些属性似乎是不可枚举的——尽管以这种方式创建的属性在默认情况下应该是可枚举的!
如何在不使用 Object.defineProperty 或类似笨拙的东西的情况下使这些属性隐式枚举?
尝试使用 for..of
和 Object.values
进行迭代(仅限 ES6):
for (const ability of Object.values(window.abilities)){
if (ability.unlocked){
$("#abilities").append(genAbilityCard(ability.name,ability.image,ability.description,ability.action));
}
}
如果您能够使用 ES6 和 for... of
循环,Alberto 的答案是您最好的选择,也是最干净的选择。
如果您仅限于 ES5,您也可以使用 for ... in
。正如您所发现的,for ... in
仅枚举键(属性 名称),而不是 属性 值,但是一旦您知道 属性 值就很容易属性 姓名:
var abilityName, ability;
for(abilityName in window.abilities){
ability = window.abilities[abilityName];
if(ability.unlocked){
$("#abilities").append(genAbilityCard(ability.name,ability.image,ability.description,ability.action));
}
}
您获得 属性 名称的事实意味着您已成功枚举属性。 Javascript 在 for ... in
的工作方式上有点奇怪。