๊ฐ์ฒด ํ์์ ๊ฐ์ง ๋ฐฐ์ด ์์์ ๊ฐ์ ์์ ํ๊ณ ์ถ์๋ค.
๊ทธ๋ฐ๋ฐ ๋ฐฐ์ด์ ๋ถ๋ณ์ฑ์ ์ง์ผ์ฃผ๋ map() ๊ณ ์ฐจํจ์๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ฒด์ ์์๋ฅผ ์์ ํ๋๋ฐ๋, ์๋ณธ ๋ฐฐ์ด์ ๋ฐ์ดํฐ๊ฐ ์์ ์์ ๋๋ ํ์์ด ๋ฐ์ํ๋ค. immutable๊ณผ mutable ์ฐจ์ด๋ฅผ ์ ๋๋ก ์๊ณ ์ฐ๊ธฐ์ํด ์ ๋ฆฌํด๋ณด๋ คํ๋ค.
๋ฐ์ดํฐ
state๋ผ๋ ๋ฐฐ์ด์ ๊ฐ์ฒด ํ์์ ์์๊ฐ ๋ค์ด๊ฐ์๋ค.
const state = [
{ id: 1, content: 'a' },
{ id: 2, content: 'b' },
];
๋ชฉํ
ํน์ id๋ก ๊ฐ์ฒด ์์๋ฅผ ์ฐพ์ ๊ทธ ์์์ content ๊ฐ์ ๋ฐ๊พธ๋ ํจ์๋ฅผ ์์ฑํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ฒ์ state๊ฐ๊ณผ ํจ์๋ฅผ ํธ์ถํ์๋์ ๋ฐํ๋๋ ๊ฐ๊ณผ, ๊ทธ ์ดํ state๊ฐ์ด๋ ๋น๊ตํด๋ด์ผ๋ก์จ ์๋ณธ state ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋์๋์ง (mutable), ๋ณ๊ฒฝ์ด ๋์ง ์์๋์ง (immutable) ์ง์ ํ์ธํด๋ณธ๋ค.
Spread operator๋ก ๊ฐ์ฒด ์์
spread ์ฐ์ฐ์๋ฅผ ํตํด ํด๋น ๊ฐ์ฒด์ content ๊ฐ์ 'aaa'๋ก ์์ ํ๋ค.
๊ฐ์ฒด ๋ฆฌํฐ๋ด { }์ ์ ์ด์ฃผ์ด ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ , ๊ทธ ๊ฐ์ฒด ๋ฆฌํฐ๋ด ์์ ์๋ ์์ el { id: 1, content: 'a' }์ ๋ด์ฉ์ ๊ทธ๋๋ก ... ๋ก ํผ์ณ์ ๋ณต์ฌํ๋ค. content ๊ฐ์ 'aaa'๋ก ๋ฎ์ด์์ฐ๊ธฐํ์ฌ ์์ ํ๋ค.
const updateContent = (paramId) => {
return state.map((el) => {
if (el.id === paramId) {
return { ...el, content: 'aaa' };
}
return el;
});
};
console.log(updateContent(1)); //id๊ฐ 1์ธ ์์๋ฅผ ์ฐพ์ ๊ทธ content ๊ฐ์ aaa๋ก ๋ฐ๊พธ๋ ํจ์ ํธ์ถ
//[{id: 1, content: 'aaa'}, {id: 2, content: 'b'}]
console.log(state);
//[{id: 1, content: 'a'}, {id: 2, content: 'b'}]
์๋ state ๋ฐฐ์ด์ id๊ฐ 1์ธ ์์์ content ๊ฐ์ 'a'์์ง๋ง, updateContent() ๋ผ๋ ํจ์๋ฅผ ํธ์ถํ๋ฉด ํจ์์ ๋ฐํ๊ฐ์ 'aaa'๋ฅผ ๊ฐ์ง ์์๋ก ์์ ๋์ด์ ๋ฐํ๋๋ค.
๊ทธ๋ผ ์ด์ updateContentํจ์๋ฅผ ํธ์ถํ๊ณ ๋ ์ดํ์ state์ ๋ฐ์ดํฐ ์ํ๋ฅผ ํ์ธํด๋ณธ๋ค.
state์ 1๋ฒ content ๊ฐ์ ์ฌ์ ํ 'a'๋ก ์ฐํ๋ ๊ฑธ ํ์ธํ ์ ์๋ค.
spread operator๋ก ๊ฐ์ฒด ๋ฆฌํฐ๋ด์ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ ๊ทธ ๊ฐ์ ์์ ํ๋ ๊ฒฝ์ฐ, ์๋ณธ state ๋ฐฐ์ด์ ๋ณ๊ฒฝ๋์ง ์๋ ๊ฒ์ด๋ค.
์ฆ, spread operator๋ก ๋ฐฐ์ด์ ์์ ํ ์ Immutable๋ก ์๋ณธ ๋ฐ์ดํฐ๋ ์ ์ง๋๋ค.
Object.assign()์ผ๋ก ๊ฐ์ฒด ์์
Object.assign() ๋ฉ์๋๋ฅผ ํ์ฉํด์ ๊ฐ์ฒด๋ฅผ ์์ ํ ์ ์๋ค.
Object.assign() ๊ตฌ๋ฌธ
Object.assign(target, ...sources)
๋ณ๊ฒฝํ ํ๊ฒ ๊ฐ์ฒด, ์๋ก์ด ์์ฑ์ผ๋ก ๋ณํฉํ ๊ฐ์ฒด
target
์ต์ข ์ ์ผ๋ก ํ๊ฒ ๋ชฉํ ๊ฐ์ฒด๋ฅผ ๋ฐํํ ๊ฒ
sources
์์ค ๊ฐ์ฒด๋ก, ํ๊ฒ ๊ฐ์ฒด์ ๋ฐ์ํ๊ณ ์ ํ๋ ์์ฑ์ ๊ฐ์ง ๊ฐ์ฒด
1)
๋จผ์ Object.assign() ๋ฉ์๋ target ์๋ฆฌ์ธ ๋งจ ์ฒ์ ์ธ์์ ๋น ๊ฐ์ฒด๋ฆฌํฐ๋ด์ ์ ์ด์ฃผ๊ณ , ...sources ์๋ฆฌ์ ์์์ ๋ด์ฉ el์ ํผ์ณ์ ๊ทธ๋๋ก ๋ณต์ฌํด์ค๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ์ธ๋ฒ์งธ ์ธ์๋ก๋ ๋ฐ๊พธ๊ณ ์ถ์ ๋ด์ฉ์ธ content ๊ฐ 'bbb'๊ฐ ์๋ ๊ฐ์ฒด๋ฅผ ์ ์ด์ค๋ค.
์ด๋ ๊ฒ๋๋ฉด ์๋ก์ด ๊ฐ์ฒด์ธ ๋น ๊ฐ์ฒด {}์ ์๋ ๊ธฐ์กด el ๋ด์ฉ์ธ {id: 2, content: 'b'} ๋ฅผ ๋ณํฉํ๊ณ , ๋ ๊ทธ ๊ฐ์ฒด์ content: 'bbb' ๊ฐ์ ๊ฐ์ง ๊ฐ์ฒด๋ก ๋ณํฉํด์ค๋ค๋ ๋ป์ด๋ค.
์ฌ๊ธฐ์ ๋ง์ง๋ง ์ธ๋ฒ์งธ ์ธ์์๋ {...el, content: 'bbb'}๋ผ๊ณ ์ ์ด์ฃผ์ด ๊ฐ์ฒด์ ์์ฑ์ ๋ชจ๋ ๋ค ์ ์ด์ฃผ์ด๋ ๋๊ณ , ์์ ํ๋ ค๋ ์์ฑ๊ฐ๋ง ์ ์ด์ฃผ์ด๋ ๋๊ฐ์ด ์๋ํ๋ค.
const updateContent2 = (paramId) => {
return state.map((el) => {
if (el.id === paramId) {
return Object.assign({}, el, { ...el, content: 'bbb' });
//return Object.assign({}, el, { content: 'bbb' }); //๋๊ฐ์ด ์๋
}
return el;
});
};
console.log(updateContent2(2)); //์์ id 2๋ฅผ ์ฐพ์ content ๊ฐ์ 'bbb'๋ก ๋ฐ๊พธ๋ ํจ์ ํธ์ถ
//[{id: 1, content: 'a'}, {id: 2, content: 'bbb'}]
console.log(state);
//[{id: 1, content: 'a'}, {id: 2, content: 'b'}]
updateContent2()๋ฅผ ํธ์ถํ ๊ฒฐ๊ณผ๊ฐ์ ๋ณด๋ฉด, ํจ์์ ๋ฐํ๊ฐ์ 'bbb'๋ฅผ ๊ฐ์ง ์์๊ฐ ๋ฆฌํด๋๋ฉด์ ์์ ๋ ๊ฐ์ด ๋ฐํ๋๋ค.
๊ทธ๋ผ ์๋ณธ ๋ฐฐ์ด์ธ state๋?
์ฌ์ ํ 'b'๊ฐ์ ๊ฐ์ง๊ณ ์๋ค. ์๋ณธ๋ฐฐ์ด์ด ์์ ๋์ง ์์๋ค.
Object.assign() ๋ฉ์๋๋ฅผ ํ์ฉํด์ ์ฒซ๋ฒ์งธ ์ธ์์ {} ๋น๊ฐ์ฒด๋ฅผ ํ ๋นํด์ ๊ฐ์ฒด๋ฅผ ์์ ํ๋ ๊ฒฝ์ฐ, ์๋ก์ด ๊ฐ์ฒด๊ฐ ๋ง๋ค์ด์ ธ ๋ฐํ๋๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ Immutable๋ก ์๋ณธ ๋ฐ์ดํฐ๊ฐ ์ ์ง๋๋ค.
2)
์ด์ Object.assign()์ ๋น ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์๋๊ณ , target ์๋ฆฌ์ ๋ฐ๋ก el์ด๋ผ๋ ๋ด๊ฐ ๋ฐ๊พธ๊ณ ์ถ์ ๊ฐ์ฒด ์์ฒด๋ฅผ ๊ฐ์ ธ์จ๋ค. ๊ทธ๋ฆฌ๊ณ , ๊ทธ el ๊ฐ์ฒด์ sources์๋ฆฌ์ ์๋ก์ด ์์ฑ์ผ๋ก ๋ฐ๊พธ๊ณ ์ถ์ ๊ฐ์ ์ ์ด์ค๋ค.
์ด ์์ ์์๋ ๋ง์ฐฌ๊ฐ์ง๋ก return Object.assign(el, {...el, content: 'bbb'})๊ณผ return Object.assign(el, {content: 'bbb'}) ์ ๋์ผํ๊ฒ ์๋ํ๋ค.
const updateContent3 = (paramId) => {
return state.map((el) => {
if (el.id === paramId) {
return Object.assign(el, { ...el, content: 'bbb' });
}
return el;
});
};
console.log(updateContent3(2)); //์์ id 2๋ฅผ ์ฐพ์ content ๊ฐ์ 'bbb'๋ก ๋ฐ๊พธ๋ ํจ์ ํธ์ถ
//[{id: 1, content: 'a'}, {id: 2, content: 'bbb'}]
console.log(state);
//[{id: 1, content: 'a'}, {id: 2, content: 'bbb'}]
updateContent3() ํธ์ถํ ๊ฒฐ๊ณผ๊ฐ์ ๋น์ฐํ ํจ์์ ๋ฆฌํด๊ฐ์ด๋ฏ๋ก ์ํ๋ ๊ฐ๋๋ก ์์ ๋ ๊ฐ์ด ๋ฐํ๋๋ค.
์ด์ ์๋ ๋ฐฐ์ด์ธ state๋ฅผ ํ์ธํด๋ณด๋ฉด?
state๋ฐฐ์ด์ ์ด์ 'bbb'๊ฐ ๋ค์ด์จ ๊ฐ์ ๊ฐ์ง๊ณ ์๋ค. ์๋ณธ ๋ฐฐ์ด์ด ์์ ๋์์์ ํ์ธํ ์ ์๋ค.
Object.assign()๋ฅผ ์ฌ์ฉ์ ์ฒซ๋ฒ์งธ ์ธ์์ ๋ฐ๊พธ๊ณ ์ถ์ ๊ฐ์ ๊ฐ์ง๊ณ ์ค๊ณ , ๋๋ฒ์งธ sources ์ธ์์ ๊ฐ์ ํ ๋นํด์ ๋ฐ๋ก ๊ฐ์ฒด๋ฅผ ๋ฐ๊พผ ๊ฒ์ด๋ฏ๋ก ์ ์์ ์ ๊ฒฝ์ฐ์๋ Mutableํ ํน์ฑ์ด ์๋ค. ์ฆ, ์๋ณธ ๋ฐ์ดํฐ๋ฅผ ์์ ํ ๊ฒ์ด๋ค.
'JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
JSON.stringify() | JSON.parse() | json() (3) | 2024.09.19 |
---|---|
api ์์ฐจ์ ์คํ | catch (err) vs catch | throw error vs return error (0) | 2024.05.22 |
TypeScript index signature ์ธ๋ฑ์ค ์๊ทธ๋์ณ (0) | 2023.09.08 |
JS parseInt() vs Number() (0) | 2022.11.13 |
JS ๊ธฐ์ ๋ฉด์ | const ํค์๋ ๊ฐ์ฒด ๊ฐ ๋ณ๊ฒฝ (0) | 2022.11.11 |