37_Pokedex
๐ป์ฃผ์ : ํฌํค API๋ฅผ ์ฌ์ฉํด ํฌ์ผ๋ชฌ ๋๊ฐ ๋ง๋ค๊ธฐ
const fetchPokemons = async () => {
for(let i = 1; i <= pokemon_count; i++) {
await getPokemon(i)
}
}
์ด 150๊ฐ์ ํฌ์ผ๋ชฌ์ด ๋์์ผ ํ๊ธฐ ๋๋ฌธ์ for ๋ฐ๋ณต๋ฌธ์ ์จ 150๊ฐ๊ฐ ๋์ค๋๋ก ํจ
const getPokemon = async (id) => {
const url = `https://pokeapi.co/api/v2/pokemon/${id}`
const res = await fetch(url)
const data = await res.json()
createPokemonCard(data)
}
const data = await res.json()
res๋ผ๋ Response ๊ฐ์ฒด์์ JSON ํ์์ ๋ฐ์ดํฐ๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ๊ฐ์ ธ์จ๋ค.
fetch ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๋ฉด, fetch ํจ์๋ Promise ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค. ์ด Promise ๊ฐ์ฒด๋ ๋น๋๊ธฐ์ ์ผ๋ก ์๋ฒ์ ์๋ต์ ๋ฐ์ผ๋ฉด ์คํ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํด๋น ์๋ต ๊ฐ์ฒด๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด await ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ๊ธฐ๋ค๋ฆฐ๋ค.
res.json()์ Response ๊ฐ์ฒด์ ๋ฉ์๋๋ก, ์๋ต ๋ฐ์ดํฐ๋ฅผ JSON ํ์์ผ๋ก ๋ณํํ๋ ์ญํ ์ ํ๋ค. ์ด ๋ฉ์๋๋ Promise๋ฅผ ๋ฐํํ๋ฏ๋ก, await ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ๊ธฐ๋ค๋ฆฐ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ณํ๋ JSON ๋ฐ์ดํฐ๋ data ๋ณ์์ ํ ๋น๋๋ค.
๐๐ป์๋ฒ์ ์๋ต์ JSON ํ์์ผ๋ก ๋ณํํ์ฌ data ๋ณ์์ ํ ๋นํ๋ค. ์ดํ ์ฝ๋์์๋ data ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ํ์ํ ์์ ์ ์ํํ ์ ์๋ค.
const main_types = Object.keys(colors)
const createPokemonCard = (pokemon) => {
const pokemonEl = document.createElement('div')
pokemonEl.classList.add('pokemon')
//์ฒซ๋ฒ์งธ ๊ธ์๋ง ๋๋ฌธ์๋ก + ๋๋จธ์ง ๋ฌธ์ ๊ทธ๋๋ก ์ถ๋ ฅ
const name = pokemon.name[0].toUpperCase() + pokemon.name.slice(1)
const id = pokemon.id.toString().padStart(3, '0')
const poke_types = pokemon.types.map(type => type.type.name)
const type = main_types.find(type => poke_types.indexOf(type) > -1)
const color = colors[type]
pokemonEl.style.backgroundColor = color
const pokemonInnerHTML = `
<div class="img-container">
<img src="https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/${pokemon.id}.png"" alt="${name}">
</div>
<div class="info">
<span class="number">#${id}</span>
<h3 class="name">${name}</h3>
<small class="type">Type: <span>${type}</span> </small>
</div>
`
pokemonEl.innerHTML = pokemonInnerHTML
poke_container.appendChild(pokemonEl)
}
Object.keys()๋ JavaScript์์ ๋ด์ฅ๋ ๋ฉ์๋๋ก, ๊ฐ์ฒด์ ์์ฑ(ํ๋กํผํฐ) ์ด๋ฆ๋ค์ ๋ฐฐ์ด๋ก ๋ฐํํ๋ค. ์ฌ๊ธฐ์๋ colors ๊ฐ์ฒด์ ์์ฑ ์ด๋ฆ๋ค, ์ฆ ํ์ (์: fire, grass, electric ๋ฑ)๋ค์ ๋ฐฐ์ด๋ก ๋ฐํํ์ฌ main_types ๋ณ์์ ์ ์ฅํ๊ณ ์๋ค.
์ด๋ ๊ฒ ๋ฐํ๋ ๋ฐฐ์ด์ main_types ๋ณ์์ ํ ๋น๋๋ฏ๋ก, ์ดํ ์ฝ๋์์ main_types ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ํ์ ์ ์ ๊ทผํ ์ ์๋ค.
๐๐ป์ด ๋ฐฐ์ด์ ์ฃผ๋ก ํฌ์ผ๋ชฌ์ ํ์ ์ ์ ์ํ๊ณ , ํ์ ์ ๋ฐ๋ผ ์ ์ ํ ์คํ์ผ์ ์ ์ฉํ๋ค.
- const id = pokemon.id.toString().padStart(3, '0')
ํฌ์ผ๋ชฌ์ ID๋ฅผ 3์๋ฆฌ ๋ฌธ์์ด๋ก ๋ณํํ๋ค.
toString() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ซ์๋ฅผ ๋ฌธ์์ด๋ก ๋ณํํ๊ณ , padStart(3, '0') ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์์ด์ ๊ธธ์ด๋ฅผ 3์๋ฆฌ๋ก ๋ง๋ค๊ณ , ๋ถ์กฑํ ์๋ฆฌ์ '0'์ ์ฑ์ด๋ค.
๐๐ป์๋ฅผ ๋ค์ด, pokemon.id ๊ฐ์ด 7์ด๋ผ๋ฉด, id ๋ณ์์ ํ ๋น๋๋ ๊ฐ์ '007'์ด ๋๋ค.
const poke_types = pokemon.types.map(type => type.type.name)
const type = main_types.find(type => poke_types.indexOf(type) > -1)
const color = colors[type]
pokemon.types ๋ฐฐ์ด์์ ๊ฐ ํ์
์ ์ด๋ฆ์ ์ถ์ถํ์ฌ poke_types ๋ฐฐ์ด์ ์์ฑํ๋ค.
๐๐ป์๋ฅผ ๋ค์ด, ํฌ์ผ๋ชฌ์ด ๋ถ๊ณผ ํ ํ์
์ ๊ฐ๋ ๊ฒฝ์ฐ poke_types๋ ['fire', 'grass']๊ฐ ๋ ๊ฒ์ด๋ค.
main_types ๋ฐฐ์ด์์ poke_types์ ํฌํจ๋ ์ฒซ ๋ฒ์งธ ํ์
์ ์ฐพ๋๋ค.
main_types ๋ฐฐ์ด์ ์ฌ์ ์ ์ ์๋ ์ฃผ์ ํ์
์ ํฌํจํ๊ณ ์๋ค. ์ด๋ฅผ ํตํด ํฌ์ผ๋ชฌ์ ์ฃผ์ ํ์
์ ๊ฒฐ์ ํ๋ค. ์๋ฅผ ๋ค์ด, main_types ๋ฐฐ์ด์ด ['fire', 'water', 'grass']๋ผ๊ณ ๊ฐ์ ํ๋ฉด, poke_types ๋ฐฐ์ด์์ ์ฒซ ๋ฒ์งธ๋ก ๋งค์นญ๋๋ ํ์
์ ์ฐพ์์ type ๋ณ์์ ํ ๋นํ๋ค.
poke_types.indexOf(type) > -1๋ poke_types ๋ฐฐ์ด์์ type ๊ฐ์ ๊ฒ์ํ์ฌ ์ธ๋ฑ์ค๋ฅผ ๋ฐํํ๋๋ฐ, ์ด ๊ฐ์ด -1๋ณด๋ค ํฌ๋ค๋ ๊ฒ์ type ๊ฐ์ด poke_types ๋ฐฐ์ด์ ์กด์ฌํ๋ค๋ ์๋ฏธ๋ค.
find() ๋ฉ์๋๋ ์ฃผ์ด์ง ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ฐฐ์ด์ ์ฒซ ๋ฒ์งธ ์์๋ฅผ ๋ฐํ
colors ๊ฐ์ฒด์์ type ๋ณ์์ ํด๋นํ๋ ์์์ ์ฐพ์ color ๋ณ์์ ํ ๋นํ๋ค. ์ด๋ฅผ ํตํด ๊ฐ ํฌ์ผ๋ชฌ์ ํ์ ์ ๋ฐ๋ผ ์ ์ ํ ์์์ ์ง์ ํ์ฌ ํฌ์ผ๋ชฌ ์นด๋์ ๋ฐฐ๊ฒฝ์์ ์ค์ ํ๋ค.