TIL

TMDB API 사용하기 5

효ㄷi 2024. 5. 1. 00:10
더보기

벌써 5월?,,, 말도안되

 

map 함수를 좀 더 고쳐봤다. 코드가 너무 더러워서 신경이 엄청 쓰였었는데...

 

챗지피티한테 물어보니까 구조 분해 할당을 사용하라고 하는 것.

 

,,,,,,,,,,아하!

 

분명히 공부한건데 써먹을 일이 없어서 기억이 잘 안 나는 게 함정.

 

재빨ㄹ ㅣ검색

 

구조 분해 할당은 객체나 배열을 변수로 분해할 수 있게 해주는 특별한 문법이다.

이런 식으로 저장되어 있는 api는 객체이므로... 이 객체들을 변수로 분해 해줄 수 있다는 것.

 

객체나 배열에 저장된 데이터 전체가 아닌 일부만 필요한 경우 사용하는 듯 싶다.

 

검색해서 예제를 하나 봤다.

 

// 이름과 성을 요소로 가진 배열
let arr = ["Bora", "Lee"]

// 구조 분해 할당을 이용해
// firstName엔 arr[0]을
// surname엔 arr[1]을 할당하였습니다.
let [firstName, surname] = arr;

alert(firstName); // Bora
alert(surname);  // Lee

배열 arr에는 bora, lee가 들어있는데 원래라면 인덱스에 접근하기 위해 

 

let arr = ["Bora", "Lee"];

let firstName = arr[0];
let surname = arr[1];

이렇게 사용해야 했을 것... (마치 나처럼,,,)

 

하지만 인덱스 없이 사용할 수 있게 만드는 문법이다!

 

객체의 경우에는 

let options = {
  title: "Menu",
  width: 100,
  height: 200
};

let {title, width, height} = options;

alert(title);  // Menu
alert(width);  // 100
alert(height); // 200

이렇게 쓸 수 있다.

 

이제 원래 나의 코드에 적용해보면

 

 

원래 코드

let card_list = movie
      .map((a) => {
        const movieTitle = a['original_name'].toLowerCase();
        const movieOverview = a['overview'];
        const movieVote = a['vote_average'].toFixed(2);
        const movieImg = `https://image.tmdb.org/t/p/original${a['poster_path']}`;
        const movieId = a['id'];

        return `<div class="movie-card"> 
      <img src="${movieImg}" alt="poster" onclick="alert(${movieId})"/>
      <h2 class="movie-title">${movieTitle}</h2>
      <p class="movie-overview">${movieOverview}</p>
      <p class="movie-vote">⭐️${movieVote}</p>
    </div>`;
      })
      .join('');

...

 

 

처음엔 챗 지피티한테 도움을 받아 이렇게 수정했다.

 

 

수정 1

let card_list = movie
  .map(({ original_name, overview, vote_average, poster_path, id}) => {
    const movieTitle = original_name.toLowerCase();
    const movieOverview = overview;
    const movieVote = vote_average.toFixed(2);
    const movieImg = `https://image.tmdb.org/t/p/original${poster_path}`;
    const movieId = id;

    return `<div class="movie-card"> 
  <img src="${movieImg}" alt="poster" onclick="alert(${movieId})"/>
  <h2 class="movie-title">${movieTitle}</h2>
  <p class="movie-overview">${movieOverview}</p>
  <p class="movie-vote">⭐️${movieVote}</p>
</div>`;
  })
  .join('');
document.querySelector('.movie-list').innerHTML = card_list;

고대로 구조 분해 할당만 사용한 것. 여전히

 

이거 분명히 더 줄일 수 있을 것 같은데?... 하다가

...

 

let card_list = movie
      .map(({ original_name, overview, vote_average, poster_path, id }) => { 
        return `<div class="movie-card"> 
      <img src="https://image.tmdb.org/t/p/original${poster_path}" alt="poster" onclick="alert(${id})"/>
      <h2 class="movie-title">${original_name.toLowerCase()}</h2>  
      <p class="movie-overview">${overview}</p>
      <p class="movie-vote">⭐️${vote_average.toFixed(2)}</p>
    </div>`; // 
      }).join('');
    document.querySelector('.movie-list').innerHTML = card_list;

 

...

 

아니 이렇게 줄일 수 있었다고?...........

 

..............

 

참고


다른 코드는 크게 안 건들고 화살표 함수로 바꿔주는 정도?... 

 document.querySelector('#search-btn').addEventListener('click', function (event) {
        event.preventDefault();
        let inputValue = document.querySelector('#input-text').value.toLowerCase();
        inputValue.trim() === '' ? alert('검색어를 입력해주세요') : showResult(inputValue);
      });

크게 달라진 건 없다.

document.querySelector('#search-btn').addEventListener('click', e => {
      e.preventDefault();
      const inputValue = document.querySelector('#input-text').value.toLowerCase(); 
      inputValue.trim() === '' ? alert('검색어를 입력해주세요') : showResult(inputValue); 
    });

 

 

 

function(event) 에서 function 키워드를 삭제하고, event롤 e로 줄였다.

 

참고