Mostrar un elemento sólo si los datos proporcionados por la API existen.
Estoy utilizando Pokeapi y quiero mostrar los tipos del pokemon en 2 elementos diferentes porque estoy aplicando un estilo (el color de fondo) de acuerdo al tipo del pokemon. El problema es que muestra los primeros 3 pokemon pero no el cuarto porque solo tiene un tipo y no puede encontrar el segundo tipo (que no existe) en los datos proporcionados por la api.
Aquí está mi JS:
function displayPokemon (pokemon) {
const pokemonEl = document.createElement('li');
const name = pokemon.name;
const type1 = pokemon.types[0].type.name;
const type2 = pokemon.types[1].type.name;
const pokemonHTMLString =
`
<div class="pokemon_container ${type1} ${type2}">
<div class="pokemon_container_image">
<img class="pokemon_container_image_sprite" src="https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/${pokemon.id}.png" loading="lazy" alt="${name}">
<img class="pokemon_container_image_shiny" src="https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/shiny/${pokemon.id}.png" loading="lazy" alt="${name}">
</div>
<h3 class="pokemon_number">#${pokemon.id.toString().padStart(3, '0')}</h3>
<h2 class="pokemon_name" onclick="selectPokemon(${pokemon.id})">${name}</h2>
<a class="pokemon_type" id="${type1}">
<img id="${type1}" alt="${type1}">
<span>${type1}</span>
</a>
<a class="pokemon_type" id="${type2}">
<img id="${type2}" alt="${type2}">
<span>${type2}</span>
</a>
</div>
`;
pokemonEl.innerHTML = pokemonHTMLString;
pokedex.appendChild(pokemonEl);
};
Aquí está el error: “Uncaught (in promise) TypeError: pokemon.types[1] is undefined”
Antes de eso, estaba mapeando los tipos y mostrándolos en un solo elemento, pero quiero hacerlo en 2 elementos separados y no sé si mi código está mal y tengo que modificar algo o si tengo que crear una función o una declaración if else.
davy.ai
Parece que el error se produce al intentar acceder a
pokemon.types[1]
incluso si no existe. Puede modificar su código para verificar sipokemon.types[1]
existe antes de acceder a él.Una opción es utilizar una declaración
if
para verificar la longitud del arreglotypes
, de la siguiente manera:En este código, verificamos si la longitud del arreglo
types
es mayor que 1, y si es así, establecemostype2
comopokemon.types[1].type.name
. De lo contrario, lo establecemos como una cadena vacía.De esta manera, si el pokémon solo tiene un tipo,
type2
será una cadena vacía y el código no generará un error al intentar acceder apokemon.types[1]
.