๋ฆฌ์กํธ๋ฅผ ์ฌ์ฉํ๊ณ ๊ณต๋ถํ๋ค๋ณด๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฌธ๋ฒ์ ๋ํด ๋ถ์กฑํ ์ ์ ๋ง์ด ๋๊ปด ์์ธํ ๊ณต๋ถํ๊ธฐ๋ก ๋ง์๋จน์๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๋ฌธ๋ฒ์ ๋ณด๋ค ์ ํํ๊ฒ ์๊ณ ์์ด์ผ ๋ฆฌ์กํธ๋ฅผ ํ๋๋ฐ๋ ์จ์ ํ ๋ด๊ฒ์ผ๋ก ๋ง๋ค ์ ์๋ ๊ฒ ๊ฐ๋ค.
๊ทธ๋ ๊ฒ ์ฝ๋์์ ๋ด๊ฐ ์์ฃผ ์ฌ์ฉํ๋ ํจ์๋ค ์์ฃผ๋ก ์์ฑํด๋ณด๋ ค๊ณ ํ๋ค.
์ค๋์ 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์ ๋์ผํ๋ค๋ฉด ์ฒดํฌํ์๋ฅผ ํ๋๋ก ๋ง๋ ์ฝ๋์ด๋ค.
์ดํด๊ฐ ๋๋๊ฐ?
๋๋ ์ด์ ์์ผ ์ด๊ฒ ์ ํํ ์ด๋ฐ๋ป์ด๊ตฌ๋๋ผ๊ณ ๊นจ๋ฌ์ผ๋ฉด์ ๊ฐ๋ ค์ ๋ ๋ถ๋ถ์ด ๊ธํ๋ ๋๋์ด๋ค.
๋ค๋ค ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์๊ณ ๋ฆฌ์กํธ๋ฅผ ๊ณต๋ถํ๋ฉด ์ข์ ๊ฒ ๊ฐ๋จ ์๊ฐ์ด ๋ ๋ค.
๊ฑฐ๊พธ๋ก ํ๊ฒ ๋๋ฉด ๋ฌ๋์ปค๋ธ๊ฐ ๋๋ฌด ๊ฐํ๋ฅธ ๊ฒ ๊ฐ์ง๋ง ์์๊ฐ๋ ์ฌ๋ฏธ๊ฐ ์์ฃผ ์ ์ ํ๋ค.
'WEB > JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ setTimeout, setInterval ๋ก ์๊ฐ ๋ณด์ฅํ๋ค๊ณ ํ ์ ์์ด? ์ด๋ป๊ฒ? (0) | 2024.01.16 |
---|---|
[JavaScript] filter() (0) | 2021.01.24 |
[JavaScript] push() & concat() (0) | 2021.01.20 |