我试着用对象制作口袋妖怪的克隆系统。使用PokeAPI,我可以得到所有口袋妖怪的进化过程,如果口袋妖怪有一个以上的进化,(即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已经在使用,但是当试图获得替代的进化时会崩溃。
发布于 2022-06-13 22:48:15
for循环就在您的console.log之上导致了这个问题。
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”中的对象少,那么这种情况就会发生。
您可以尝试通过使用浏览器开发控制台逐步遍历程序来查找错误。
这显然是一个复制和粘贴错误,现在我们知道要寻找什么。
https://stackoverflow.com/questions/72609776
复制相似问题