I'm pulling the types of a Pokémon from the pokeAPI for my discord.js command. It's working fine if a Pokémon has two types, but I'm having an issue when a Pokémon has only one type.
I define them in my file:
const type1 = types[0].type.name; const type2 = types[1].type.name;
And load them in my embed:
{ name: "Type", value: `${type1}, ${type2}`, inline: false, },
The API data:
One Type
"types": [ { "slot": 1, "type": { "name": "normal", "url": "https://pokeapi.co/api/v2/type/1/" } } ],
Two Types
"types": [ { "slot": 1, "type": { "name": "poison", "url": "https://pokeapi.co/api/v2/type/4/" } }, { "slot": 2, "type": { "name": "flying", "url": "https://pokeapi.co/api/v2/type/3/" } } ],
When I try to run my command with a Pokémon with one type, I get the following error in the console: TypeError: Cannot read properties of undefined (reading 'type')
I figure I've got to do something in the embed to ignore the second type if it isn't there, but I can't figure it out. I tried the following also, but the api is not returning anything, even null:
`${type1}, ${type2 == null ? `` : `${type2}`}`
Someone who can help me on the right track?
CodePudding user response:
It seems that the second item in the array (index 1) is missing in that case. So you need to check if the array is long enough.
const type2 = types.length>1 ? types[1].type.name : null;
CodePudding user response:
At its core, the issue is that the array can be any length. I think a better approach here would be something like this:
var typeList = types.map(t => t.name).join(', ');
This will produce the comma-separated listing without concerning yourself with its length.
Then you can build the object like this:
{
name: "Type",
value: typeList,
inline: false,
}
CodePudding user response:
If you're using ES6, you could use nullish coalescing operator to shorten up your code.
Eg:
const type2 = type[1]?.type?.name ?? null;