我目前正在构建一个 Pokémon 应用程序,因此我正在从 PokéAPI 访问数据,并将特定数据存储在变量中,例如名称、id 和类型。
目前我在存储第二种类型的神奇宝贝时遇到问题。有些有一种类型,有些有两种。
如果神奇宝贝有两种类型,则数据结构如下所示: Bulbasaur JSON 数据截图来自 pokeapi.co/api/v2/pokemon/bulbasaur
以下是具有 1 种类型的 Pokémon 示例的 JSON 数据链接:https://pokeapi.co/api/v2/pokemon/bulbasaur
如果神奇宝贝只有一种类型,则结构如下所示: Togepi JSON 数据截图来自 https://pokeapi.co/api/v2/pokemon/togepi
链接:https://pokeapi.co/api/v2/pokemon/togepi
为了检查是否存在第二种类型,我编写了一个函数:
function CheckPropertySecondtype(str) {
if (str.hasOwnProperty("types"[1])) {
pokemondata.secondtype = str.types[1].type.name;
console.log("Pokemon has a second type");
} else {
pokemondata.secondtype = "none";
console.log(str.types[1].type.name);
}
}
问题是,if 语句没有按照我想要的方式工作。它始终为 false,这意味着无论是否存在第二种类型,输出始终为“none”。我尝试了几种符号,例如
hasOwnProperty(types[1].type.name)
或 hasOwnProperty(
types1.type.name)
.
如何正确访问密钥来检查这一点?
正如其他人在评论中提到的,
str.hasOwnProperty("types"[1])
相当于str.hasOwnProperty("y")
,这应该是错误的。一种选择是将其分为两种情况:
if (str.hasOwnProperty("types") && str.types.hasOwnProperty(1)) {
// ...
}
(请注意,第二个条件可以重写为
str.types.length >= 1
)。如果 str
没有 types
属性,则表达式将短路,因此对 str.types[1]
的检查将永远不会运行(因此不会出错)。
或者,您可以使用 可选链 来更简单地编写它:
if (str.types?.[0] !== undefined) {
// ..
}