Javascript data structure with map, reduce, filter and ES6 - Lee-hyuna/33-js-concepts-kr GitHub Wiki
Javascript ๋ฐ์ดํฐ ๊ตฌ์กฐ, map, reduce, filter ๊ทธ๋ฆฌ๊ณ ES6
์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ช ๋ นํ ํ๋ก๊ทธ๋๋ฐ๋ถํฐ ์ ์ธ์ ์คํ์ผ๊น์ง ์ด๋ ํ ์คํ์ผ์ ์์ฑ๋ ๊ฐ๋ฅํ๋๋ก ํด์ค ์ธ์ด์ ๋๋ค. ๋๋ถ๋ถ์ ํ๋ก๊ทธ๋๋จธ๋ ๋ช ๋ นํ์ ์ฌ์ฉํฉ๋๋ค. ์๋ํ๋ฉด ๊ทธ๋ค์ ๊ฐ์ฒด์งํฅ์ธ์ด๋ฅผ ๋ฐฐ๊ฒฝ์ผ๋ก ์์ํ๊ฑฐ๋, ๊ทธ๋ค์ ๊ทธ๊ฒ์ ์ฌ๋ํ๊ฑฐ๋ ๋ค๋ฅธ ์คํ์ผ์ ์ต์ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ฐ๋ฆฌ๊ฐ FP์ธ ์ ์ธ์ ์คํ์ผ์ ๋ ๊ฐ๋ก ๋๋๊ธฐ ์ ์, ์์๋ฅผ ํตํด์ ๋ ๊ฐ์ ๋ค๋ฅธ ์ ์ ์ดํดํฉ์๋ค. (๋ง์ฝ์ ๋น์ ์ด ์ด๋ฏธ ์๊ณ ์๋ค๋ฉด ๋ช ๋ฌธ๋จ์ ํจ์คํด๋๋ฉ๋๋ค.)
Imperative
// to calculate the sum of array elements
const sum = (arr) => {
let result = 0;
for (let i = 0; i < arr.length; i++) {
result += arr[i];
}
return result;
};
๋ช ๋ นํ ์คํ์ผ์ ๋ฉ์ง์ง๋ง ๋ง์ฝ ๋ณต์กํ ์ํ ๋ ผ๋ฆฌ๊ฐ ์๋ค๊ณ ์์ํ์๋ ์ฝ๋ ํฌ๊ธฐ์ ๊ฐ๋ ์ฑ์ ํํธ์์ ๊ฒ์ ๋๋ค. ๊ทธ๊ฒ์ ์ฝ์ ๋ ์ธ์ง๋ถํ๋ฅผ ์ฆ๊ฐ์ํค๊ณ , ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์ถ๋ก ๊ณผ ๋ ผ๋ฆฌ์ ์์ด์ ๋ ์ฝ๊ฒ ํค๋งค๋๋ก ํด์ค๋๋ค.
๋ํ, ์ด ์ฝ๋ ์ค๋ํซ์ ์ฃผ์ ๋ณต์ก์ฑ์ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ฒ์ ์ปดํจํฐ์ ๋งํ๋ ๋์ , ์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ์ ์ด๋ป๊ฒ ํ๋์ง ์ง์ํ๊ณ ์๋ค๋ ์ฌ์ค์์ ๋น๋กฏ๋ฉ๋๋ค.
Declarative
// calculate the sum of array elements
const sum = (arr) => arr.reduce((total, item) => total += item, 0);
์ด์ ,์ด ์ฝ๋๋ ๊ฝค ๊น๋ํ๊ณ ์งง์๋ณด์ด๊ณ ์ ๋ฌ๋ ฅ์๊ณ ๊ฐ๊ฒฐํ ์ฝ๋์ฒ๋ผ ๋ณด์ ๋๋ค. ์๋ฌ๋ฅผ ์ก์ถํ ๊ฑฐ ๊ฐ์ง ์๊ณ , ์ ์ง๋ณด์ํ๊ธฐ ์ฝ๊ณ ๋๋ฒ๊น ํ๊ธฐ๋ ์ฌ์๋ณด์ ๋๋ค. ์ฐ๋ฆฌ๋ ์ปดํจํฐ์๊ฒ ์ด๋ป๊ฒ ํ๋ ๊ฒ ๋์ ์ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ฒ์ ์ ๋ฌํฉ๋๋ค.
์ ์ธ๋ฌธ์ ์ปดํ์ผ๋ฌ ์ข ๋ฃ์์ ์ฝ๊ฒ ์ต์ ํํ ์ ์๋๋ก ์ ๊ทผํ๊ณ ์ ์ ๋ถ์์ฉ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
Note: ๋ง์ฝ์ ์ ๋ ๊ฐ์ ์ฑ๋ฅ๊ณผ ๋ค๋ฅธ ์๋ฐ์คํฌ๋ฆฝํธ ํจ์(map, reduce, filter, find)์ ๋ํด ๊ฑฑ์ ํ๊ณ ์๋ค๋ฉด, ๋ฐ๋์ ์์ data set์ ์ํด ์ด๊ฑธ ์ฝ๊ณ large data set(100โ1000000)์ ์ํด ์ฌ๊ธฐ๋ฅผ ํ์ธํ์ธ์.
๋์ด์ ์ง์ฒดํ์ง๋ง๊ณ , FP๋ฅผ ์ํด ์ ์ผ ๋ง์ด ์ฌ์ฉ๋๋ ์๋ฐ์คํฌ๋ฆฝํธ ํจ์์ ํจ๊ป ์์ํด๋ด ์๋ค.
Map
// definition
collection.map((currentValue, index) => {
// Return element for newArray
});
// example
const arr = [1,2,3,4,5];
const newArray = arr.map(i => i*10);
// return a new array with all value as multiple of 10;
Map ๋ฐฐ์ด์์ ์๋ํ๊ณ ๋ฐฐ์ด์ ๋ฐํํฉ๋๋ค. ์ ์ฝ๋ ์ค๋ํซ์ ์งํฉ(์: ๋ฐฐ์ด)์์ ์๋ํ๋ฉฐ, ํ์ฌ ๋ฐ๋ณต ๊ฐ์ ๊ฐ์ง ์ฝ๋ฐฑ์ ์ธ์๋ก์ ์ธ๋ฑ์คํ๊ณ ์ ๋ฐฐ์ด์ ๋ฐํํฉ๋๋ค.
Note: Map์ ์ผ๋ถ ์กฐ๊ฑด์์๋ ํ๋ฆ์ ๋๋ ๋์ ์ ์ฒด ๋ฐฐ์ด์ ๋ณ๊ฒฝ/๋ณํํ๋ ๋ฐ ์ ํฉํ๋ฉฐ, map์ ์ฑ๋ฅ์ ํ๋ช ํ๊ฒ ํ์ ํ ๋ ค๋ฉด ์ฌ๊ธฐ์์ ํ์ธํ์ญ์์ค. ๊ทธ๋ฌ๋ ์์ data sets์ ์ฌ์ฉํ๊ธฐ ์ฝ์ต๋๋ค.
Reduce
// definition
collection.reduce((accumulator, item, index) => {
// logic to perform to get accumulator as a return value
}, initialValue for accumulator);
// example
const arr = [1,2,3,4,5];
const total = arr.reduce((acc, item) => acc+= item, 0);
// return a total as 15
Reduce๋ ๋ฐฐ์ด์์ ์๋ํ์ง๋ง ๋ฐํ ํ ์์๋ ๋ชจ๋ ๊ฒ์ ๋ฐํ ํ ์ ์์ต๋๋ค. ์ด๋ฆ ์์ฒด๊ฐ ๋งํ๋ฏ์ด ๋ฌด์์ด๋ ์ค์ผ ์ ์์ผ๋ฉฐ map
, find
, filter
๋๋ ๋ค๋ฅธ ์๋ฐ์คํฌ๋ฆฝํธ ํจ์์ฒ๋ผ ํ๋ ํ ์ ์์ต๋๋ค. ์์ ์ฝ๋ ์ค๋ํซ์ ๋ฐฐ์ด์์ ์๋ํ๊ณ ๋ฐฐ์ด ํญ๋ชฉ์ ์ด ๊ฐ์ ๊ณ์ฐํ๊ธฐ ์ํด ์ค์
๋๋ค.
์ ์์ ์ ์ค๋ช
: ์ฒซ ๋ฒ์งธ ์ค์ ์ค์ด๋ฉด acc์ 0 ๊ฐ์ด ํ ๋น๋๊ณ acc += item
์ฆ acc + acc + item
์ด 0 + 1
1๋ก ๊ณ์ฐ๋ฉ๋๋ค. ์ด 1์ ๋ค์ ๋ฐ๋ณต ๋ฐ ๋ชจ๋ ๋ฐฐ์ด ํญ๋ชฉ์ ๋ค ๋๋ผ ๋๊น์ง ๊ณ์๋ฉ๋๋ค.
Find
// definition
collection.find((item) => {
// return first element that satisfy the condition
});
// example
const arr = [1,2,8,4,5];
const value = arr.find(i => i%4 == 0);
// return the first value i.e 8
Find๋ ๋ฐฐ์ด์์ ์๋ํ๊ณ ํจ์์์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์ฒซ ๋ฒ์งธ ์์๋ฅผ ๋ฐํํฉ๋๋ค.
Note: ์ฝ๊ณ ๋จ์ํ์ง๋ง ๋์ฉ๋ data set์์๋ ํจ์จ์ ์ด์ง ์์ ์ด์ ๋ ๋ฌด์์ ๋๊น? ์ฌ๊ธธ ๋ณด์ธ์
์ผ๋ถ ์ค์ ์๋๋ฆฌ์ค + ์ผ๋ถ ES6์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. (์๋์ ๊ฐ์ฒด ํค์์ ARMD๋ฅผ ์๋ํด๋ณด์ญ์์ค)
ARMD๊ฐ Add, Read, Modify, Delete, ์์ ์ ํน์ ์ฉ์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ฟจ๋งํ๋ ๊ฒ์ด ๋ฌด์์ธ์ง ๊ถ๊ธํฉ๋๋ค ๐
const users = [
{
id: 1,
name: "Jonathon Haley",
username: "Monte.Weber2",
email: "[email protected]",
phone: "1-563-675-1857 x11708",
website: "carmela.net",
password: "hashed_password"
},
{
id: 2,
name: "Dean John",
username: "dd.1",
email: "[email protected]",
phone: "1-123-543-1857 123212",
website: "dd.net",
password: "Dean_hashed_password"
}
];
์ถ๊ฐ ์์ ๋ฅผ ์ํด ๋ฐฐ์ด๋ก users๋ฅผ ์ฌ์ฉํฉ๋๋ค.
A
RMD - users์๊ฒ ์๋ก์ด ์์ ์ถ๊ฐ
1. const newUser = {
id: 4,
name: "Denomer Crazy",
username: "crazy.1",
email: "[email protected]",
phone: "",
website: "crazy.app",
password: "crazed_checker"
};
const newData = [...users, newUser]; // add element at last
or
const newData = [newUser, ...users]; // add element at first
or
const newData = users.concat(newUser) // the old way
ES6 ์คํ๋ ๋ ์ฐ์ฐ์์ ์ฌ์ฉ์ ๋ฐฐ์ด์ ์์๋ฅผ ์ถ๊ฐํ๊ธฐ๊ฐ ๋งค์ฐ ์ฝ์ต๋๋ค. ์คํ๋ ๋ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๊ฐ์ ๋ค๋ฅธ ๋ฐฐ์ด์ ์์ถํ๊ฑฐ๋ ๊ฐ์ฒด์ ๋ชจ์์ ์์ ํ๊ฑฐ๋ ๋์ ํค ๊ฐ ์ ๋ฑ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
const hobbies = ['chess', 'pool'];
const newUsers = users.map(u => ({...u, hobbies}))
// this will add hobbies to users array and return newUsers array
R
MD - users์ email, phone ๋ฐ website๋ฅผ ์๋ก์ด ๋ฐฐ์ด๋ก ๊ฐ์ ธ์ต๋๋ค.
2. Aconst contactInfo = users.map(({email, website, phone}) => ({email, website, phone}));
๊ฐ์ฒด ํค์ map์ ๊ตฌ์กฐ๋ฅผ ํด์ ํ๋ es6์ ์ฌ์ฉํ์ฌ users์ ์ฐ๋ฝ์ฒ ์ ๋ณด ๋ฐฐ์ด์ ๊ฐ์ ธ์ต๋๋ค.
M
D - ๊ฐ์ฒด ํค ๊ฐ ์ฐพ๊ธฐ ๋ฐ ๋ฐ๊พธ๊ธฐ
3. ARconst newUsers = users.map(u => u.id == 2? ({...u, name: 'te'}): u);
// this will return newUsers with all user having name 'te'
D
- ๊ฐ์ฒด์์ ์ผ๋ถ ํค ์ญ์
3. ARMNote : ์ค์ ๋ก ํค๋ฅผ ์ญ์ ํ์ง ์๊ณ ์ ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค. ํค ์ญ์ ์ฐ์ฐ์๋ฅผ ์ญ์ ํ๋ ค๋ฉด ์ฌ๊ธฐ์์ ๊ฐ์ฒด ๋ถ๋ณ์ฑ์ ๊ณ ๋ คํด์ผํฉ๋๋ค.
ํค๋ฅผ ์ญ์ ํ๋ ค๋ฉด ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ง๋ง ๊ฐ์ฅ ์ฝ๊ณ ๋จ์ผ ๋ผ์ธ์ผ๋ก ๋ณผ ์ ์์ต๋๋ค. users๋ก๋ถํฐ website๋ฅผ ์ญ์ ํด๋ด ์๋ค.
const newUsers = users.map({id, email, name, username, phone, password} => ({id, email, username, email, phone, password}));
// will return an array with all keys other than website
์์ ์ฝ๋๋ ํฐ ๊ฐ์ฒด๋ฅผ ์ํด ์ฝ๋ํ ํ๊ธฐ๊ฐ ์ฌ์ค์ ์ด๋ ค์ด ๊ฒ ๊ฐ์ต๋๋ค.
const newUsers = users.map(u => Object.keys(u).reduce((newObj, key) => key != 'website' ? { ...newObj, [key]: u[key]} : newObj, {}));
์ฐ๋ฆฌ๋users
๋ฅผ ํตํด map
์ํ๊ณ , ๊ฐ๊ฐ์user
์reduce
๋ฅผํ๊ณ new object
(newObj)๋ฅผ ๋ง๋ ๋ค์ website ํค๋ฅผ ํ์ธํฉ๋๋ค.
๋ง์ฝ website๊ฐ ์ด์ ์ ํ์ฑ๋ ๊ฒ์ newObj๋ฅผ ๋ฐํํ๊ณ ๊ทธ๋ ์ง ์๋ค๋ฉด ์คํ๋ ๋ ์ฐ์ฐ์๋ฅผ ์ํํ๊ณ obj์ require ํค๋ฅผ ์ถ๊ฐํ๊ณ ๋ง์นจ๋ด newObj๋ฅผ ๋ฐํํฉ๋๋ค.
์ด์ ์ ํ์ฑ๋ newObj๋ฅผ ๋ฐํํ๋ค๋ฉด, ์คํ๋ ๋ ์ฐ์ฐ์๋ฅผ ์ํํ๊ณ obj์ require ํค๋ฅผ ์ถ๊ฐํ๊ณ ๋ง์นจ๋ด newObj๋ฅผ ๋ฐํํฉ๋๋ค.
ํ ๊ฐ์ฌ๋๋ฆฝ๋๋ค! ๐ฐ
๋ด Bitcoin ์ฃผ์ : 132Ndcy1ZHs6DU4pV3q2X1GzSCdBEXX6pz
My Ethereum ์ฃผ์ : 0xc46204dfc8449Ffb0f02a9e1aD81F30D3f027010
๋ด ์ด๋ฉ์ผ ๋ชฉ๋ก์ ์ถ๊ฐํ๊ณ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐ github์์ ๋ ๋ง์ ๊ธฐ์ฌ๋ฅผ ์ฝ์ผ๋ ค๋ฉด ๋์ ์ด๋ฉ์ผ์ ์ฌ๊ธฐ ์ ์ ๋ ฅํ์ญ์์ค. ๋ด ๋ฏธ์น ์ฝ๋๋ฅผ ๋ณผ ์ ์์ต๋๋ค
๋์ ๋ค๋ฅธ ๊ธฐ์ฌ๋ฅผ ์ข์ํ ์๋ ์์ต๋๋ค.
- Nodejs app structure
- Javascript ES6- Iterables and Iterators
- Javascript generator-yield/next & async-await
์ด ๊ฒ์๋ฌผ์ด ๋์์ด ๋์๋ค๋ฉด ์๋์ ๐ ๋ฐ์ ์น๊ธฐ ๋ฒํผ์ ํด๋ฆญํ์ฌ ์ง์์ ํ์ํ์ญ์์ค! ๋ํ ๋ค๋ฅธ ์ฌ๋๋ค์ด ์ฝ๊ฒ ์ฐพ์ ์ ์๋๋ก ์ถ์ฒํ๊ณ ๊ณต์ ํ์ญ์์ค!
๊ฐ์ฌํฉ๋๋ค!