[英]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.