簡體   English   中英

對象屬性返回 undefined 即使它存在 JavaScript

[英]object property returns undefined even though it exists JavaScript

我正在嘗試使用對象制作口袋妖怪的克隆系統。 使用 PokeAPI,我得到了所有 pokemon 的進化,如果 pokemon 有超過 1 個進化,(IE Kirlia),它將所有進化對象屬性推送到 Pokemon.evolutions,這是這些進化對象的數組。 當我嘗試編譯代碼時它崩潰說: TypeError: Cannot read properties of undefined (reading 'species') ,所以我認為這意味着因為我輸入了錯誤的對象,但不是這樣,如果我 console.log data.evolves_to[i].species.name (導致應用程序崩潰的行),我得到了口袋妖怪的名字,它是正確的! 然后它在同一條線上崩潰! 它登錄到控制台然后崩潰。 這是怎么回事? 這是上下文的代碼:

 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在獲得第一次進化時已經在使用,但在嘗試獲得替代進化時崩潰。

console.log正上方的for循環導致了問題

for (let i = 0; i < data.evolves_to[0].evolves_to.length; i++)

當我認為你只需要“data.evolves_to.length”時,你有“data.evolves_to[0].evolves_to.length”。

如果“data.evolves_to”中的對象少於“data.evolves_to[0].evolves_to”中的對象,無論發生什么情況,都會發生這種情況。

您可以嘗試通過使用瀏覽器開發控制台單步執行程序來查找錯誤。

現在我們知道要查找什么,這顯然是一個復制和粘貼錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM