JavaScript

[JavaScript] ๋ฐฐ์—ด์„ ์ผ์ผ์ด ์ˆœํšŒํ•˜์ง€ ์•Š๊ณ  ๋” ๋นจ๋ฆฌ ๊ฐ’์„ ์ฐพ๊ณ  ์‹ถ๋‹ˆ? new Set() ์จ๋ณผ๋ž˜?

Dana10 2025. 1. 15. 23:41
$bookmark.addEventListener('click',() => {
    const $movieCards = document.querySelectorAll('.movieCard');
    const bookmarkedMovies = handleBookmark('get');
    const newRenderData = movieData.filter(({id}) => bookmarkedMovies.includes(id));

    $movieCards.forEach((card) => card.remove());

    if(newRenderData.length === 0){
        //๊ธฐ์กด์— ์ด๋ฏธ ํ•ด๋‹น ์š”์†Œ('๋ถ๋งˆํฌ๋œ ์˜ํ™”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.')๊ฐ€ ์ถ”๊ฐ€๋˜์–ด ์žˆ์œผ๋ฉด ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ
      if (!$main.querySelector('.noMovie')) {
        const noBookmarkedMovie = document.createElement('div');
        noBookmarkedMovie.className = 'noMovie';
        noBookmarkedMovie.textContent = '๋ถ๋งˆํฌ๋œ ์˜ํ™”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.';
        $main.appendChild(noBookmarkedMovie);
      } 

    } else renderMoviCard(newRenderData);
})

 

handleBookmard('get')์€ localStorage์— ์ €์žฅ๋œ ๊ฐ’๋“ค์„ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.

localStorage์— ์ €์žฅ๋œ ๊ฐ’๋“ค์„ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด๋กœ ๋งŒ๋“ค์–ด newRenderData์— ํ• ๋‹นํ•œ๋‹ค.

renderMovieCard(newRenderData)๋ฅผ ํ†ตํ•ด ํ™”๋ฉด์„ ์ƒˆ๋กญ๊ฒŒ ๊ทธ๋ฆฐ๋‹ค. (๋ถ๋งˆํฌ ๋œ ์• ๋“ค์„ ๋ณผ ์ˆ˜ ์žˆ์Œ)

 

์—ฌ๊ธฐ์„œ ๋ฌธ๋“ ๋“  ์ƒ๊ฐ.. 

movieData๋ฅผ filterํ•˜๋ฉด movieData๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ํ•œ ๋ฒˆ ์ˆœํšŒํ•  ํ…Œ๊ณ 

bookmarkedMovies์— id๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด bookmarkedMovies๋„ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์ˆœํšŒ๋ฅผ ํ•ด์•ผ ํ•  ํ…๋ฐ

์ˆœํšŒ๋ฅผ ํ•˜๋Š”๋ฐ ๊ทธ ์•ˆ์—์„œ ๋˜ ์ˆœํšŒ๋ฅผ ํ•œ๋‹ค๋ผ.. 

์ด ์ฝ”๋“œ ๊ดœ์ฐฎ์€ ๊ฑฐ ๋งž๋‚˜? ๋ญ”๊ฐ€ ์ตœ์„ ์ด ์•„๋‹Œ ๊ฑฐ ๊ฐ™์€ ๋А๋‚Œ์ ์ธ ๋А๋‚Œ.. 

์•„! Set์„ ์จ๋ณผ๊นŒ? Set์ด ๊ฐ’์— ๋น ๋ฅด๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์–˜๊ธฐ๋ฅผ ์˜ˆ์ „์— ๋“ค์—ˆ๋˜ ๊ฑฐ ๊ฐ™์€๋ฐ.

์‚ฌ์‹ค Set์— ๋Œ€ํ•ด ์ž˜ ๋ชจ๋ฅด๊ธฐ๋„ ํ•˜๊ณ  ์ผ๋‹จ ์•Œ์•„๋‚˜ ๋ณด์ž.

 

์ด๋Ÿฐ ์ƒ๊ฐ ํšŒ๋กœ๋กœ ์˜ค๋Š˜ ์ด ๊ธ€์„ ์“ฐ๊ฒŒ ๋˜์—ˆ๋‹ค!

 

์ผ๋‹จ ๋‘˜์˜ ๊ณตํ†ต์ ๊ณผ ์ฐจ์ด์ ์„ ์•Œ์•„๋ณด์ž.

๋ฐฐ์—ด(Array)์™€ Set์€ ๋‘˜ ๋‹ค ๊ฐ™์€ ํƒ€์ž…์˜ ์—ฌ๋Ÿฌ ๊ฐ’๋“ค์„ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.

 

๋‹ค๋งŒ ๋ฐฐ์—ด์€

  • index๊ฐ€ ์žˆ์–ด ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜๊ณ  ๊ฐ’์ด ์ค‘๋ณต๋  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฐฐ์—ด์—์„œ ํŠน์ • ๊ฐ’์„ ์ฐพ๋Š”๋‹ค๋ฉด ๋ฐฐ์—ด ์•ˆ์— ์žˆ๋Š” ๋ชจ๋“  ๊ฐ’๋“ค์„ ์ˆœํšŒํ•ด์•ผ ํ•œ๋‹ค.
  • ๋”ฐ๋ผ์„œ ํŠน์ • ๊ฐ’์„ ์ฐพ๋Š”๋ฐ, ์ˆœํšŒํ•˜๋Š” ๋ฐฐ์—ด ๋ฐ์ดํ„ฐ๊ฐ€ ํฌ๋‹ค๋ฉด ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค.

๋ฐ˜๋ฉด Set์€

  • ๋‚ด๋ถ€์ ์œผ๋กœ ๊ฐ’(ํ˜น์€ ํ‚ค)๋ฅผ ์ €์žฅํ•  ๋•Œ ํ•ด์‹œ๊ฐ’์„ ๊ณ„์‚ฐํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ํŠน์ • ์œ„์น˜์— ์ €์žฅํ•œ๋‹ค.
  • ๋”ฐ๋ผ์„œ ๊ฐ™์€ ๊ฐ’์„ ์ €์žฅํ•˜๋ ค๊ณ  ํ•˜๋ฉด ํ•ด๋‹น ๊ฐ’์„ ๊ฐ–๊ณ  ์žˆ๋Š” ํ•ด์‹œ ๊ฐ’์ด ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ถ”๊ฐ€์ ์œผ๋กœ ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.(๊ฐ’ ์ค‘๋ณต ์ €์žฅ ๋ถˆ๊ฐ€)
  • ์ฆ‰ Set์€ ๊ณ ์œ ํ•œ ๊ฐ’๋“ค๋งŒ ์ €์žฅํ•œ๋‹ค.
  • ํ•ด์‹œ๊ฐ’์œผ๋กœ ์ ‘๊ทผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜์ง€ ์•Š๊ณ 
  • ํŠน์ • ๊ฐ’์„ ์ฐพ์„ ๋•Œ์—๋„ ๋ชจ๋“  ๊ฐ’๋“ค์„ ์ˆœํšŒํ•  ํ•„์š” ์—†์ด has ๋ฉ”์„œ๋“œ๋กœ ๋ฐ”๋กœ ํ•ด๋‹น ํ•ด์‹œ ๊ฐ’์— ์ ‘๊ทผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ’์„ ๊ธˆ๋ฐฉ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋Ÿผ ๋ฌด์กฐ๊ฑด Set์„ ์“ฐ๋Š” ๊ฒŒ ์ข‹์€ ๊ฑด๊ฐ€?? 

That' a nono!

 

Array๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ ๋ฐฐ์—ด ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ถ”๊ฐ€์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์ด ๋ถˆํ•„์š”ํ•˜๋‹ค.

ํ•˜์ง€๋งŒ Set์€ ๊ฐ’๋“ค์„ ๋‹ค์‹œ ํ•ด์‹œ๊ฐ’์œผ๋กœ ๊ณ„์‚ฐํ•ด ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ถ”๊ฐ€์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

์ฆ‰, Set์ด ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๋” ํฌ๋‹ค.

 

๋Œ€์‹  Set์€ ์‹คํ–‰ ์†๋„๊ฐ€ ๋นจ๋ผ CPU์˜ ๋ถ€ํ•˜๋ฅผ ์ค„์—ฌ์ฃผ๋Š” ๋ฐ˜๋ฉด Array๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ํด์ˆ˜๋ก CPU์— ๋ถ€ํ•˜๊ฐ€ ๊ฑธ๋ฆฌ๊ฒŒ ๋œ๋‹ค.

 

๋”ฐ๋ผ์„œ ๋ฐ์ดํ„ฐ ํฌ๊ธฐ๊ฐ€ ์ž‘๊ฑฐ๋‚˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์šฐ์„ ์ ์œผ๋กœ ๊ณ ๋ คํ•œ๋‹ค๋ฉด Array๋ฅผ ์‚ฌ์šฉํ•˜๊ณ 

๋ฐ์ดํ„ฐ ํฌ๊ธฐ๊ฐ€ ํฌ๊ฑฐ๋‚˜ ์†๋„๋ฅผ ์šฐ์„ ์ ์œผ๋กœ ๊ณ ๋ คํ•œ๋‹ค๋ฉด Set์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ ์ ˆํ•˜๊ฒ ๋‹ค.

 

๊ฒฐ๋ก ์ ์œผ๋กœ ๋‚ด๊ฐ€ ๊ณ ๋ฏผํ–ˆ๋˜ ์ฝ”๋“œ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ž‘๊ธฐ ๋•Œ๋ฌธ์— Array๋ฅผ ์‚ฌ์šฉํ•ด๋„ ํฐ ๋ฌธ์ œ๊ฐ€ ์—†์–ด ๋ณด์ธ๋‹ค.

๊ทธ๋ž˜๋„ Set์„ ๊ณต๋ถ€ํ–ˆ์œผ๋‹ˆ ํ•œ ๋ฒˆ ์ ์šฉํ•ด ๋ณด์•˜๋‹ค.

$bookmark.addEventListener('click',() => {
    const $movieCards = document.querySelectorAll('.movieCard');
    const bookmarkedMovies = new Set(handleBookmark('get'));
    const newRenderData = movieData.filter(({id}) => bookmarkedMovies.has(id));

    $movieCards.forEach((card) => card.remove());

    if(newRenderData.length === 0){
        //๊ธฐ์กด์— ์ด๋ฏธ ํ•ด๋‹น ์š”์†Œ('๋ถ๋งˆํฌ๋œ ์˜ํ™”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.')๊ฐ€ ์ถ”๊ฐ€๋˜์–ด ์žˆ์œผ๋ฉด ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ
      if (!$main.querySelector('.noMovie')) {
        const noBookmarkedMovie = document.createElement('div');
        noBookmarkedMovie.className = 'noMovie';
        noBookmarkedMovie.textContent = '๋ถ๋งˆํฌ๋œ ์˜ํ™”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.';
        $main.appendChild(noBookmarkedMovie);
      } 

    } else renderMoviCard(newRenderData);
})