如果键名称是数字,则对嵌套对象键使用 hasOwnProperty

问题描述 投票:0回答:1

我目前正在构建一个 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
)
.

如何正确访问密钥来检查这一点?

javascript javascript-objects
1个回答
0
投票

正如其他人在评论中提到的,

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) {
 // ..
}
© www.soinside.com 2019 - 2024. All rights reserved.