首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对象属性返回未定义的,即使它存在JavaScript。

对象属性返回未定义的,即使它存在JavaScript。
EN

Stack Overflow用户
提问于 2022-06-13 22:38:03
回答 1查看 79关注 0票数 1

我试着用对象制作口袋妖怪的克隆系统。使用PokeAPI,我可以得到所有口袋妖怪的进化过程,如果口袋妖怪有一个以上的进化,(即Kirlia),它会推送所有的进化对象属性-- Pokemon.evolutions,这是这些进化对象的数组。当我试图编译代码时,它会崩溃,上面写着:TypeError: Cannot read properties of undefined (reading 'species'),所以我认为它意味着,因为我输入了对象,但不是这样,如果我console.log data.evolves_to[i].species.name (导致应用程序崩溃的行),我会得到口袋妖怪的名字,它是正确的!然后它在同一条线上坠毁!它被登录到控制台,然后崩溃。到底怎么回事?以下是上下文代码:

代码语言:javascript
复制
 async getRandomPokemon() {
    const rawData: PokemonData[] | PokemonSpecies[] = [];
    const id = utils.rng({ min: 1, max: 898 });
    rawData[0] = await api.getPokemonById(id);
    rawData[1] = await api.getPokemonSpeciesById(id);
    const pokemon: Pokemon = {
      name: rawData[0].name,
      level: utils.rng({ min: 1, max: 10 }),
      gender: utils.pick({ array: ["male", "female"] }),
      exp: 1,
      stats: {
        hp: rawData[0].stats[0].base_stat,
        atk: rawData[0].stats[1].base_stat,
        def: rawData[0].stats[2].base_stat,
        spa: rawData[0].stats[3].base_stat,
        spd: rawData[0].stats[4].base_stat,
        spe: rawData[0].stats[5].base_stat,
        IVs: {
          hp: utils.rng({ min: 0, max: 31 }),
          atk: utils.rng({ min: 0, max: 31 }),
          def: utils.rng({ min: 0, max: 31 }),
          spa: utils.rng({ min: 0, max: 31 }),
          spd: utils.rng({ min: 0, max: 31 }),
          spe: utils.rng({ min: 0, max: 31 }),
        },
        EVs: {
          hp: utils.rng({ min: 0, max: 252 }),
          atk: utils.rng({ min: 0, max: 252 }),
          def: utils.rng({ min: 0, max: 252 }),
          spa: utils.rng({ min: 0, max: 252 }),
          spd: utils.rng({ min: 0, max: 252 }),
          spe: utils.rng({ min: 0, max: 252 }),
        },
      },
      moves: [],
      evolutions: [],
      aesthetics: {
        sprite: rawData[0].sprites.front_default,
        color: rawData[1].color.name,
      },
      rarity: {
        isLegendary: rawData[1].is_legendary,
        isMythical: rawData[1].is_mythical,
        catchRate: rawData[1].capture_rate,
      },
    };
    const json = await axios(rawData[1].evolution_chain.url);
    let data = json.data.chain;
    for (let i = 0; i < data.evolves_to.length; i++) {
      const one: boolean = data.evolves_to[i].evolves_to.length === 0;
      pokemon.evolutions.push({
        first: data.species.name,
        second: {
          name: data.evolves_to[i].species.name,
          mode: {
            name: data.evolves_to[i].evolution_details[0].trigger.name,
            gender: data.evolves_to[i].evolution_details[0].gender,
            level: data.evolves_to[i].evolution_details[0].min_level,
            item: data.evolves_to[i].evolution_details[0].item
              ? data.evolves_to[i].evolution_details[0].item.name
              : null,
            happiness: data.evolves_to[i].evolution_details[0].min_happiness,
            move: data.evolves_to[i].evolution_details[0].known_move,
          },
        },
        third: one
          ? null
          : {
              name: one ? null : data.evolves_to[i].evolves_to[0].species.name,
              mode: {
                name: data.evolves_to[i].evolves_to[0].evolution_details[0]
                  .trigger.name,
                gender:
                  data.evolves_to[i].evolves_to[0].evolution_details[0].gender,
                level:
                  data.evolves_to[i].evolves_to[0].evolution_details[0]
                    .min_level,
                item: data.evolves_to[i].evolves_to[0].evolution_details[0].item
                  ? data.evolves_to[i].evolves_to[0].evolution_details[0].item
                      .name
                  : null,
                happiness:
                  data.evolves_to[i].evolves_to[0].evolution_details[0]
                    .min_happiness,
                move: data.evolves_to[i].evolves_to[0].evolution_details[0]
                  .known_move,
              },
            },
      });
      if (data.evolves_to[0].evolves_to.length > 1) {
        for (let i = 0; i < data.evolves_to[0].evolves_to.length; i++) {
          console.log(data.evolves_to[i].species.name);
          pokemon.evolutions.push({
            first: data.species.name,
            second: {
              name: data.evolves_to[i].species.name,
              mode: {
                name: data.evolves_to[i].evolution_details[0].trigger.name,
                gender: data.evolves_to[i].evolution_details[0].gender,
                level: data.evolves_to[i].evolution_details[0].min_level,
                item: data.evolves_to[i].evolution_details[0].item
                  ? data.evolves_to[i].evolution_details[0].item.name
                  : null,
                happiness:
                  data.evolves_to[i].evolution_details[0].min_happiness,
                move: data.evolves_to[i].evolution_details[0].known_move,
              },
            },
            third: one
              ? null
              : {
                  name: one
                    ? null
                    : data.evolves_to[i].evolves_to[0].species.name,
                  mode: {
                    name: data.evolves_to[i].evolves_to[0].evolution_details[0]
                      .trigger.name,
                    gender:
                      data.evolves_to[i].evolves_to[0].evolution_details[0]
                        .gender,
                    level:
                      data.evolves_to[i].evolves_to[0].evolution_details[0]
                        .min_level,
                    item: data.evolves_to[i].evolves_to[0].evolution_details[0]
                      .item
                      ? data.evolves_to[i].evolves_to[0].evolution_details[0]
                          .item.name
                      : null,
                    happiness:
                      data.evolves_to[i].evolves_to[0].evolution_details[0]
                        .min_happiness,
                    move: data.evolves_to[i].evolves_to[0].evolution_details[0]
                      .known_move,
                  },
                },
          });
        }
      }
    }
    return pokemon;
  },

应用程序崩溃的代码是console.log(data.evolves_to[i].species.name); (106,几乎位于底部)。奇怪的是,当获得第一次进化时,data.evolves_to[i].species.name已经在使用,但是当试图获得替代的进化时会崩溃。

EN

回答 1

Stack Overflow用户

发布于 2022-06-13 22:48:15

for循环就在您的console.log之上导致了这个问题。

代码语言:javascript
复制
for (let i = 0; i < data.evolves_to[0].evolves_to.length; i++)

当我认为你只需要"data.evolves_to.evolves_to.length“的时候,你就有了"data.evolves_to.length”。

如果"data.evolves_to“中的对象比"data.evolves_to.evolves_to”中的对象少,那么这种情况就会发生。

您可以尝试通过使用浏览器开发控制台逐步遍历程序来查找错误。

这显然是一个复制和粘贴错误,现在我们知道要寻找什么。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72609776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档