๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
WEB/JavaScript

[JavaScript] map ํ•จ์ˆ˜

by mingzoo 2021. 2. 1.

๋ฆฌ์•กํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ณต๋ถ€ํ•˜๋‹ค๋ณด๋‹ˆ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฌธ๋ฒ•์— ๋Œ€ํ•ด ๋ถ€์กฑํ•œ ์ ์„ ๋งŽ์ด ๋Š๊ปด ์ž์„ธํžˆ ๊ณต๋ถ€ํ•˜๊ธฐ๋กœ ๋งˆ์Œ๋จน์—ˆ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฌธ๋ฒ•์„ ๋ณด๋‹ค ์ •ํ™•ํ•˜๊ฒŒ ์•Œ๊ณ ์žˆ์–ด์•ผ ๋ฆฌ์•กํŠธ๋ฅผ ํ•˜๋Š”๋ฐ๋„ ์˜จ์ „ํžˆ ๋‚ด๊ฒƒ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

๊ทธ๋ ‡๊ฒŒ ์ฝ”๋“œ์—์„œ ๋‚ด๊ฐ€ ์ž์ฃผ ์‚ฌ์šฉํ–ˆ๋˜ ํ•จ์ˆ˜๋“ค ์œ„์ฃผ๋กœ ์ž‘์„ฑํ•ด๋ณด๋ ค๊ณ ํ•œ๋‹ค.

์˜ค๋Š˜์€ mapํ•จ์ˆ˜์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

์ด ๊ธ€์€ MDN ๊ณผ ์ œ๋กœ์ดˆ๋‹˜์˜ ๋ธ”๋กœ๊ทธ๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 


map ํ•จ์ˆ˜

๋ฐฐ์—ด.map((์š”์†Œ, ์ธ๋ฑ์Šค, ๋ฐฐ์—ด) => { return ์š”์†Œ });

arr.map(callback(currentValue[, index[, array]])[, thisArg])

mapํ•จ์ˆ˜๋Š” ์œ„์™€๊ฐ™์€ ๊ตฌ๋ฌธ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

๋‘๊ฐ€์ง€ ๊ตฌ๋ฌธํ‘œํ˜„๋ฐฉ๋ฒ•์€ ๋‚˜๋Š” ์•„๋ž˜์˜ ํ‘œํ˜„๋ณด๋‹ค๋Š” ์œ„์˜ ํ‘œํ˜„์ด ๋” ์™€๋‹ฟ์•˜๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

๋ฐฐ์—ด ๋‚ด์˜ ๋ชจ๋“  ์š”์†Œ ๊ฐ๊ฐ์— ๋Œ€ํ•˜์—ฌ ์ฃผ์–ด์ง„ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ์•„ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค.

 

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ถ€ํ„ฐ ๋จผ์ € ๋ด๋ณด์ž

const array1 = [1, 4, 9, 16];

const map1 = array1.map(x => x * 2);

console.log(map1);
//์ถœ๋ ฅ : Array [2, 8, 18, 32]

๋ณด๋ฉด map1์— ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์ด ๋ฐ˜ํ™˜๋˜๋Š”๊ฒŒ ๋ณด์ด์ฃ ?

map์€ callback ํ•จ์ˆ˜๋ฅผ ๊ฐ๊ฐ์˜ ์š”์†Œ์— ๋Œ€ํ•ด ํ•œ๋ฒˆ์”ฉ ์ˆœ์„œ๋Œ€๋กœ ๋ถˆ๋Ÿฌ์„œ ์กฐ๊ฑด์— ๋งž๋Š” ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด ๋ฐ˜ํ™˜ํ•œ๋‹ค.

callback ํ•จ์ˆ˜๋Š” ํ˜ธ์ถœ๋  ๋•Œ ๋Œ€์ƒ ์š”์†Œ์˜ ๊ฐ’, ๊ทธ ์š”์†Œ์˜ ์ธ๋ฑ์Šค, ๊ทธ๋ฆฌ๊ณ  map์„ ํ˜ธ์ถœํ•œ ์›๋ณธ ๋ฐฐ์—ด 3๊ฐœ์˜ ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌ๋ฐ›๋Š”๋‹ค.

 

์ผ๋‹จ ์ด์ •๋„๋˜๋ฉด ๋ญ”๊ฐ€ ๋Œ€์ถฉ ์ดํ•ด๊ฐ€ ๋œ ๊ฒƒ ๊ฐ™์œผ๋‹ˆ๊นŒ ๐Ÿ“–๋ฆฌ์•กํŠธ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ธฐ์ˆ ๐Ÿ“–์ฑ…์—์„œ mapํ•จ์ˆ˜๋ฅผ ๊ต‰์žฅํžˆ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š”๋ฐ ๊ทธ ์ค‘์˜ ์˜ˆ์ œ ํ•˜๋‚˜๋ฅผ ๊ฐ€์ ธ์™€์„œ ์ ์šฉํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

 


๐Ÿ“–๋ฆฌ์•กํŠธ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ธฐ์ˆ ๐Ÿ“–์ฑ…์—์„œ์˜ 10์žฅ ์˜ˆ์ œ์˜€๋˜ ํˆฌ๋‘๋ฆฌ์ŠคํŠธ ๋งŒ๋“ค๊ธฐ์—์„œ mapํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ ๋ถ€๋ถ„์„ ๊ฐ€์ ธ์™€๋ดค๋‹ค.

import React, { useState, useRef, useCallback, useEffect } from 'react';
import TodoTemplate from './TodoTemplate';
import TodoInsert from './TodoInsert';
import TodoList from './TodoList';

const App = () => {
  const [todos, setTodos] = useState
    ([
      {
        id: 1,
        text: '๋ฆฌ์•กํŠธ ํˆฌ๋‘๋ฆฌ์ŠคํŠธ ๋งŒ๋“ค๊ธฐ',
        checked: true,
      },
      {
        id: 2,
        text: 'ํ† ํ”Œ ์˜ค๋‹ต๋…ธํŠธ',
        checked: false,
      },
      {
        id: 3,
        text: '๋ธ”๋กœ๊ทธ ํฌ์ŠคํŒ…',
        checked: true,
      },
    ])

  //๊ณ ์œ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ๋  id
  // ref๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€์ˆ˜ ๋‹ด๊ธฐ
  const nextId = useRef(3);

  const onInsert = useCallback(
    text => {
      const todo = {
        id: nextId.current,
        text,
        checked: false,
      };
      setTodos(todos => todos.concat(todo));
      nextId.current += 1; //nextId 1์”ฉ ๋”ํ•˜๊ธฐ
    },
    [todos],
  );

  const onRemove = useCallback(
    id => {
      setTodos(todos => todos.filter(todo => todo.id !== id));
    },
    [todos]
  )

  const onToggle = useCallback(
    id => {
      setTodos(todos =>
        todos.map(todo =>
          todo.id === id ? { ...todo, checked: !todo.checked } : todo,
        ),
      )
    },
    [todos],
  )

  useEffect(() => {
    var num = 0
    for (var i = 0; i < todos.length; i++) {
      if (todos[i].checked === true) {
        num += 1
        if (num === todos.length) {
          alert("์ถ•ํ•˜ํ•ฉ๋‹ˆ๋‹ค.");
        }
      }
    }
  }
    , [todos]);

  return (
    <TodoTemplate>
      <TodoInsert onInsert={onInsert} />
      <TodoList todos={todos} onRemove={onRemove} onToggle={onToggle} />
    </TodoTemplate>
  );
};

export default App;

 

์ฝ”๋“œ์˜ ํ•˜๋‹จ์— ๋ณด๋ฉด onToggle ์ปดํฌ๋„ŒํŠธ์— mapํ•จ์ˆ˜๊ฐ€ ์“ฐ์ธ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ ๋ถ€๋ถ„๋งŒ ์ž˜๋ผ๋‚ด์„œ ๋ณด๋ฉด

const onToggle = useCallback(
    id => {
      setTodos(todos =>
        todos.map(todo =>
          todo.id === id ? { ...todo, checked: !todo.checked } : todo,
        ),
      )
    },
    [todos],
  )

์ „์ฒด์ฝ”๋“œ์—์„œ ์œ„์— todos๋ผ๋Š” ๋ฐฐ์—ด์„ ์„ค์ •ํ•ด์ค€๊ฒƒ์„ ๊ธฐ์–ตํ•˜๊ณ ์žˆ๋‹ค๋ฉด, 

todos.map( todo => todo.id === id ? {...todo, checked : !todo.checked } : todo )

์ด ์ฝ”๋“œ๊ฐ€ ๋ฐฐ์—ด todos์˜ ์š”์†Œ์ธ todo๋ฅผ ์ฐจ๋ก€๋กœ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด๋ฉด์„œ ์‚ผํ•ญ ์—ฐ์‚ฐ์ž์— ๋„ฃ์–ด๋ณด๋Š”๊ฒƒ์ด๋‹ค.

๊ทธ ์š”์†Œ์˜ id๊ฐ€ ์ง€์ •๋œ id์™€ ๋™์ผํ•˜๋‹ค๋ฉด ์ฒดํฌํ‘œ์‹œ๋ฅผ ํ•˜๋„๋ก ๋งŒ๋“  ์ฝ”๋“œ์ด๋‹ค.

 

์ดํ•ด๊ฐ€ ๋˜๋Š”๊ฐ€?

 

๋‚˜๋Š” ์ด์ œ์„œ์•ผ ์ด๊ฒŒ ์ •ํ™•ํžˆ ์ด๋Ÿฐ๋œป์ด๊ตฌ๋‚˜๋ผ๊ณ  ๊นจ๋‹ฌ์œผ๋ฉด์„œ ๊ฐ€๋ ค์› ๋˜ ๋ถ€๋ถ„์ด ๊ธํžˆ๋Š” ๋Š๋‚Œ์ด๋‹ค.

๋‹ค๋“ค ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์•Œ๊ณ  ๋ฆฌ์•กํŠธ๋ฅผ ๊ณต๋ถ€ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹จ ์ƒ๊ฐ์ด ๋“ ๋‹ค.

๊ฑฐ๊พธ๋กœ ํ•˜๊ฒŒ ๋˜๋ฉด ๋Ÿฌ๋‹์ปค๋ธŒ๊ฐ€ ๋„ˆ๋ฌด ๊ฐ€ํŒŒ๋ฅธ ๊ฒƒ ๊ฐ™์ง€๋งŒ ์•Œ์•„๊ฐ€๋Š” ์žฌ๋ฏธ๊ฐ€ ์•„์ฃผ ์ ์ ํ•˜๋‹ค.

728x90