[JS] ์๋ฐ์คํฌ๋ฆฝํธ reduce() ๋ฉ์๋ ํ์ฉ ์์ ๋ชจ์
Array.reduce()
๋ฉ์๋๋ ๋ฐฐ์ด์ ์๋ ๊ฐ ์์์ ์ฝ๋ฐฑ ํจ์๋ฅผ ์คํํ์ฌ ๋์ ๋ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ํ๋์ ๊ฐ์ผ๋ก ๋ฐํํ๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์์ ์ ๊ณตํ๋ filter()
, map()
๋ฑ์ ๋ฐฐ์ด ๋ฉ์๋๋ ๋ชจ๋ reduce()
๋ก ๊ตฌํํ ์ ์๊ณ , ์ด ์ธ์๋ ๋ค์ํ ํ์ฉ ๋ฐฉ๋ฒ์ด ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ธ์ ์ผ๋ก ๊ฐ์ฅ ์์ฃผ ์ฌ์ฉํ๋ ๋ฐฐ์ด ๋ฉ์๋๋ค. reduce()
๋ฉ์๋์ ๊ตฌ๋ฌธ์ ์๋์ ๊ฐ๋ค.
reduce(callbackFn, initialValue?)
callbackFn
์ฝ๋ฐฑ ํ๋ผ๋ฏธํฐaccumulator
: ์ด์ callbackFn
๋ฐํ๊ฐ- ์ด๊ธฐ๊ฐ ์ง์ ์ ์ฝ๋ฐฑ์ ์ฒ์ ํธ์ถํ์ ๋ ๊ฐ :
initialValue
- ์ด๊ธฐ๊ฐ ๋ฏธ์ง์ ์ ์ฝ๋ฐฑ์ ์ฒ์ ํธ์ถํ์ ๋ ๊ฐ :
array[0]
- ์ด๊ธฐ๊ฐ ์ง์ ์ ์ฝ๋ฐฑ์ ์ฒ์ ํธ์ถํ์ ๋ ๊ฐ :
currentValue
: ํ์ฌ ์ํํ๊ณ ์๋ ๊ฐ- ์ด๊ธฐ๊ฐ ์ง์ ์ ์ฝ๋ฐฑ์ ์ฒ์ ํธ์ถํ์ ๋ ๊ฐ :
array[0]
- ์ด๊ธฐ๊ฐ ๋ฏธ์ง์ ์ ์ฝ๋ฐฑ์ ์ฒ์ ํธ์ถํ์ ๋ ๊ฐ :
array[1]
- ์ด๊ธฐ๊ฐ ์ง์ ์ ์ฝ๋ฐฑ์ ์ฒ์ ํธ์ถํ์ ๋ ๊ฐ :
currentIndex
: ํ์ฌ ์ํํ๊ณ ์๋ ๊ฐ์ ์ธ๋ฑ์คarray
: reduce๋ฅผ ํธ์ถํ ๋ฐฐ์ด
initialValue
(์ด๊ธฐ๊ฐ) :callbackFn
์ฝ๋ฐฑ์ ์ฒ์ ํธ์ถํ ๋ accumulator์ ์ฌ์ฉํ ์ด๊ธฐ๊ฐ. ๋ฏธ์ง์ ์ ๋ฐฐ์ด(array) ์ฒซ ๋ฒ์งธ ์ธ์๋ฅผ ์ด๊ธฐ๊ฐ์ผ๋ก ์ฌ์ฉ. ์ด๊ธฐ๊ฐ ์ง์ ์ ๋ฐฐ์ด ์ฒซ ๋ฒ์งธ ์์๋ ์ํ์ ํฌํจ ์ ํจ.
์ซ์ ๋ํ๊ธฐ | Summing Numbers
reduce()
๋ฉ์๋์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์ฌ์ฉ ์์. ์ซ์๋ก ์ด๋ค์ง ๋ฐฐ์ด์ด ์ฃผ์ด์ก์ ๋ ๋ชจ๋ ์๋ฅผ ๋ํ ๊ฐ์ ๋ฐํํ๋ค.
const odds = [1, 3, 5, 7, 9, 11];
const sumOfOdds = odds.reduce((acc, cur) => acc + cur);
console.log(sumOfOdds); // 36
๋ฐฐ์ด ํผ์น๊ธฐ | Flattening Arrays
Array.flat()์ ์ค์ฒฉ๋ ๋ฐฐ์ด์ ํผ์ณ์ ๋จ์ผ ๋ฐฐ์ด๋ก ๋ง๋๋ ๋ฉ์๋๋ค. reduce()
๋ฅผ ์ด์ฉํ๋ฉด flat()
๋ฉ์๋์ ๋์ผํ๊ฒ ๊ตฌํํ ์ ์๋ค.
const nestedArray = [[1, 2], [3, 4], [5, 6]];
const flattenedArray = nestedArray.reduce((acc, cur) => acc.concat(cur), []);
console.log(flattenedArray); // [1, 2, 3, 4, 5, 6]
์ ์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก 1 depth๋ง ํผ์น ์ ์๋ค. 2 depth ์ด์ ์ค์ฒฉ๋ ๋ฐฐ์ด์ด๋ผ๋ฉด ์ฌ๊ท๋ฅผ ์ด์ฉํ๋ฉด ๋๋ค.
const nestedArray = [1, 2, [3, 4, [5, 6]]];
const deepFlat = (arr) => {
return arr.reduce((acc, cur) => {
return acc.concat(Array.isArray(cur) ? deepFlat(cur) : cur);
}, []);
};
const flattenedArray = deepFlat(nestedArray);
console.log(flattenedArray); // [1, 2, 3, 4, 5, 6]
๊ฐ์ฒด ๊ทธ๋ฃนํ | Grouping Objects
๊ฐ์ฒด๋ฅผ ์์๋ก ๊ฐ๋ ๋ฐฐ์ด์์, ํน์ ํ๋กํผํฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ทธ๋ฃนํ(Grouping) ํด์ผ ํ๋ ์ํฉ์ ์์ฃผ ์ ํ๋ค. ์๋ฅผ ๋ค์ด ์๋์ฒ๋ผ age
์ฐ๋ น๋ณ๋ก ๊ทธ๋ฃน์ ๋๋๋ ์ํฉ์ ์๊ฐํด ๋ณผ ์ ์๋ค.
// ์๋ณธ ๋ฐฐ์ด
[
{ name: 'A', age: 20 },
{ name: 'B', age: 30 },
{ name: 'C', age: 20 },
{ name: 'D', age: 30 },
];
// ์ฐ๋ น๋ณ๋ก ๊ทธ๋ฃนํ
{
20: [
{ name: 'A', age: 20 },
{ name: 'C', age: 20 },
],
30: [
{ name: 'B', age: 30 },
{ name: 'D', age: 30 },
],
};
์ด๊ธฐ๊ฐ์ ๊ฐ์ฒด๋ก ์ง์ ํ reduce()
๋ฅผ ํ์ฉํ๋ฉด ๊ฐํธํ๊ฒ ๊ทธ๋ฃนํํ ์ ์๋ค. ๊ฐ age
ํค๋ง๋ค ๋ฐฐ์ด์ ์์ฑํ๊ณ , ํ์ฌ ์ํํ๋ ๊ฐ์ฒด์ age
์์ฑ์ ํด๋นํ๋ ๋ฐฐ์ด์ push ํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ๋ฉด ๋๋ค.
const users = [
{ name: 'A', age: 20 },
{ name: 'B', age: 30 },
{ name: 'C', age: 20 },
{ name: 'D', age: 30 },
];
const groupByAge = users.reduce((acc, cur) => {
const { age } = cur;
if (!acc[age]) acc[age] = [];
acc[age].push(cur);
return acc;
}, {});
console.log(groupByAge);
/*
{
20: [{ name: 'A', age: 20 }, { name: 'C', age: 20 }],
30: [{ name: 'B', age: 30 }, { name: 'D', age: 30 }]
}
*/
์ฐธ๊ณ ๋ก ๊ฐ์ฒด ๊ทธ๋ฃนํ์ ES15(ECMAScript 2024)๋ถํฐ ์ ๊ณตํ๋ groupBy() ๋ฉ์๋๋ฅผ ์ด์ฉํ ์๋ ์๋ค. ์ด ๋ฉ์๋๋ Chrome 117 ๋ฒ์ , Node.js 21 ๋ฒ์ ์ดํ๋ถํฐ ์ฌ์ฉํ ์ ์๋ค(Baseline 2024).
const groupByAge = Object.groupBy(users, ({ age }) => age);
console.log(groupbyAge); // {20: Array(2), 30: Array(2)}
์กฐํ์ฉ ๋งต | Lookup Maps
๋ฐฐ์ด ๊ฐ ์์๊ฐ ๊ฐ์ฒด์ด๊ณ , ๊ฐ ๊ฐ์ฒด๋ ๊ณ ์ ํ id
ํ๋กํผํฐ๋ฅผ ๊ฐ์ง ๋, id
๋ก ๋น ๋ฅด๊ฒ ์กฐํํ ์ ์๋ Lookup ๋งต์ ์์ฑ ํด๋๋ฉด, ํน์ id
๋ฅผ ๊ฐ์ง ์์์ O(1) ์๊ฐ ๋ณต์ก๋๋ก ๋น ๋ฅด๊ฒ ์ ๊ทผํ ์ ์๋ค. ๋งค๋ฒ find()
๊ฐ์ ๋ฉ์๋๋ก ์ํํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ ๋ฉด์์ ๋ ์ ๋ฆฌํ๋ค.
const products = [
{ id: 1, name: 'iPhone' },
{ id: 2, name: 'iPad' },
{ id: 3, name: 'iMac' },
];
const productMap = products.reduce((acc, cur) => {
acc[cur.id] = cur;
return acc;
}, {});
console.log(productMap);
/*
{
1: { id: 1, name: 'iPhone' },
2: { id: 2, name: 'iPad' },
3: { id: 3, name: 'iMac' }
}
*/
console.log(productMap[3]); // { id: 3, name: 'iMac' }
ํ์ ๊ณ์ฐ | Counting Occurrences
๋ฐฐ์ด ๋ด ํน์ ์์๊ฐ ๋ช ๊ฐ ์๋์ง ๊ณ์ฐํ ๋๋ reduce()
๋ฉ์๋๋ฅผ ํ์ฉํ ์ ์๋ค. ๋น ๊ฐ์ฒด๋ฅผ ์ด๊ธฐ๊ฐ์ผ๋ก ์ง์ ํ๊ณ , ๊ฐ ์์๋ฅผ ๊ฐ์ฒด ํค๋ก ์ฌ์ฉํ์ฌ ์ํํ ๋๋ง๋ค ํค์ ํด๋นํ๋ ์นด์ดํธ๋ฅผ 1์ฉ ์ฆ๊ฐํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ๋ค.
const products = ['iPhone', 'iMac', 'MacBook', 'iPhone', 'iMac', 'iPhone'];
const productCounts = products.reduce((acc, cur) => {
acc[cur] = (acc[cur] ?? 0) + 1;
return acc;
}, {});
console.log(productCounts); // { iPhone: 3, iMac: 2, MacBook: 1 }
ํจ์ ํฉ์ฑ | Composing Functions
ํจ์ ํฉ์ฑ์ ์ฌ๋ฌ ํจ์๋ฅผ ํ๋์ ํจ์๋ก ๊ฒฐํฉํ์ฌ, ๊ฐ ํจ์์ ์ถ๋ ฅ์ ๋ค์ ํจ์์ ์
๋ ฅ์ผ๋ก ์ฌ์ฉํ๋ ๋ฐฉ์์ผ๋ก ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์์ ์์ฃผ ์ฌ์ฉํ๋ ํจํด์ด๋ค. ํจ์ ํฉ์ฑ์ f(g(x))
์ ๊ฐ์ด ๋ด๋ถ ํจ์๋ถํฐ ์ธ๋ถ ํจ์ ์์ผ๋ก ์คํ๋๋๋ฐ reduce()
๋ฉ์๋๋ฅผ ์ด์ฉํด์ ๊ตฌํํ ์ ์๋ค.
const compose = (...funcs) => {
return (x) => funcs.reduce((acc, fn) => fn(acc), x);
};
const increment = (x) => x + 1;
const square = (x) => x * x;
const decrement = (x) => x - 1;
// (x) => func.reduce((acc, f) => f(acc), x)
const composedFunc = compose(increment, square, decrement);
console.log(composedFunc(5)); // 35
์ ์์๋ ์๋์ฒ๋ผ ํจ์๋ฅผ ์คํํ ๊ฒ๊ณผ ๋์ผํ๋ค.
// imcrement -> square -> decrement
decrement(square(increment(5)));
๋ง์ฝ ํจ์ ์คํ ์์๋ฅผ ๋ฐ๋๋ก ํ๊ณ ์ถ๋ค๋ฉด ์ค๋ฅธ์ชฝ ์์๋ถํฐ ์ํํ๋ reduceRight() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
์ค๋ณต ์ ๊ฑฐ | Deduplication
๋ฐฐ์ด์ ์ค๋ณต ์ ๊ฑฐ๋ Set() ๊ฐ์ฒด๋ฅผ ์ด์ฉํ๋ฉด ๊ฐ๋จํ๊ฒ ์ํํ ์ ์๋ค. ํ์ง๋ง ํน์ ์์์ ๋ํด์ ์ค๋ณต์ ํ์ฉํ๋ ๋ฑ ์ถ๊ฐ์ ์ธ ๋ก์ง์ ์ ์ฉํ ์ ์๋ค. ์ด๋ฐ ์์
์ญ์ reduce()
๋ฉ์๋๋ฅผ ํ์ฉํ ์ ์๋ค.
const numbers = [1, 1, 2, 3, 2, 2, 6, 8, 8, 11, 12];
const allowList = new Set([8]); // 8์ ์ค๋ณต ํ์ฉ
const uniqueNumbers = numbers.reduce((res, num) => {
if (!res.includes(num) || allowList.has(num)) res.push(num);
return res;
}, []);
console.log(uniqueNumbers); // [ 1, 2, 3, 6, 8, 8, 11, 12 ]
ํ๊ท ๊ณ์ฐ | Calculating Average
reduce()
๋ฉ์๋๋ฅผ ์ด์ฉํด์ ์ซ์๋ก ์ด๋ค์ง ๋ฐฐ์ด์ ํ๊ท ๊ฐ์ ๊ณ์ฐํ ์๋ ์๋ค. ๊ฐ ์์๋ฅผ ์ํํ๋ฉด์ ๋ชจ๋ ๊ฐ์ ๋ํ ํ, ๋ง์ง๋ง ์์๋ฅผ ์ํํ ๋ ์ดํฉ์ ์์ ๊ฐ์๋ก ๋๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ฉด ๋๋ค.
const rates = [3, 2, 1, 5, 4, 3];
const average = rates.reduce((total, rate, idx, { length }) => {
const sum = total + rate;
if (idx === length - 1) return sum / length;
return sum;
}, 0);
console.log(average); // 3
ํ๋ก๋ฏธ์ค ์ฒด์ด๋ | Promise Chaining
์์ฃผ ์ฌ์ฉํ๋ ํจํด์ ์๋์ง๋ง reduce()
๋ฉ์๋๋ฅผ ์ด์ฉํด์ ํ๋ก๋ฏธ์ค ์ฒด์ธ์ ๊ตฌ์ฑํ ์๋ ์๋ค. ๋๋ ์ด ์๊ฐ์ ๋ํ๋ด๋ ๊ฐ ์์๋ฅผ ์ํํ ๋๋ง๋ค prevPromise.then(...)
ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํ๊ณ , ์ด๋ ๊ฒ ๋ฐํ๋ ํ๋ก๋ฏธ์ค๋ ๋ค์ ์ํ์ prevPromise
๊ฐ ๋ผ์ ๋น๋๊ธฐ ์์
์ ์์ฐจ์ ์ผ๋ก ์คํํ๋๋ก ๋ง๋ ๋ค.
const wait = (delay) => {
return new Promise((resolve, _reject) => {
console.log('[wait]', delay);
setTimeout(() => resolve(delay), delay);
});
};
const delayList = [1000, 2000, 3000, 4000];
delayList.reduce((prevPromise, curDelay) => {
console.log('[reduce]', prevPromise, curDelay);
// ์ํ๋ง๋ค prevPromise.then(...) ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํ๊ณ , ๋ค์ ์ํ์ prevPromise๊ฐ ๋๋ค
return prevPromise.then((res) => {
console.log('[then]', res);
return wait(curDelay);
});
}, Promise.resolve('start'));
/*
์ ์ฝ๋๋ ์๋ ํ๋ก๋ฏธ์ค ์ฒด์ธ๊ณผ ๋์ผํ๋ค:
Promise.resolve('start')
.then(() => wait(1000))
.then(() => wait(2000))
.then(() => wait(3000))
.then(() => wait(4000))
*/
์ฝ์ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ๋ค.
๋ชจ๋ ๋ฐฐ์ด ๋ฉ์๋๋ ๋๊ธฐ์ ์ผ๋ก ์๋ํ๊ธฐ ๋๋ฌธ์ ์ฝ๋ฐฑ ๋ด์์ ๋น๋๊ธฐ ์์ ์ ์ํํด๋ reduce๋ ํ๋ก๋ฏธ์ค๊ฐ ์ฒ๋ฆฌ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ค์ ์ฝ๋ฐฑ์ ์คํ์ํจ๋ค. ์ฆ, ์ฝ๋ฐฑ ๋ด์์ ์ํํ ๋น๋๊ธฐ ์์ ์ reduce ๋ฉ์๋์ ์ ์ด๋ฅผ ๋ฒ์ด๋ ๋ณ๋๋ก ์ฒ๋ฆฌ๋๋ค.
๋น๋๊ธฐ๋ก ํธ์ถ๋ ํจ์๋ ํ์คํฌ ํ๋ก ๋ค์ด๊ฐ๋๋ฐ, ํ์ ์๋ ํจ์๋ค์ ์ฝ์คํ์ด ๋น์ด์์ด์ผ๋ง ์คํ๋ ์ ์๋ค. ๋ฐ๋ผ์ reduce ๋ฉ์๋์ ๋ชจ๋ ์ํ๋ฅผ ์๋ฃํ ํ์ ๋น๋๊ธฐ ์์ ๋ค์ด ์ฐจ๋ก๋๋ก ์คํ๋๋ค.
๐กthen
, catch
, finally
๊ฐ์ ํ์ ์ฒ๋ฆฌ ๋ฉ์๋๋ ํญ์ ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํ๋ค. ํ์ ์ฒ๋ฆฌ ๋ฉ์๋ ์ธ์์ ์ ๋ฌํ ์ฝ๋ฐฑ ํจ์๊ฐ ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํ๋ฉด ๊ทธ๋๋ก ๋ฐํํ๊ณ , ํ๋ก๋ฏธ์ค๊ฐ ์๋ ๊ฐ์ ๋ฐํํ๋ฉด ํด๋น ๊ฐ์ ์๋ฌต์ ์ผ๋ก resolve ํน์ reject ํด์ ํ๋ก๋ฏธ์ค๋ฅผ ์์ฑํ ํ ๋ฐํํ๋ค. ํ๋ก๋ฏธ์ค๊ฐ ๋๊ธฐ(pending) ์ํ์ด๋ฉด ํ์ ์ฒ๋ฆฌ ๋ฉ์๋๋ ํ๋ก๋ฏธ์ค๊ฐ ์ฒ๋ฆฌ๋๊ธธ ๊ธฐ๋ค๋ฆฌ๊ณ , ์ด๋ฏธ ์ฒ๋ฆฌ(settled) ์ํ๋ผ๋ฉด ํธ๋ค๋ฌ๋ ์ฆ๊ฐ ์คํ๋๋ค.
Immutable vs Mutable
reduce ๋ฉ์๋๋ ํฌ๊ฒ ๋ถ๋ณ(Immutable)๊ณผ ๊ฐ๋ณ(Mutable) 2๊ฐ์ง ์ฌ์ฉ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ ์ ์๋ค. ๋ถ๋ณ์ ์ด๋ฆ ๊ทธ๋๋ก ํ ๋ฒ ์์ฑํ ํ ๋ณ๊ฒฝํ ์ ์๋ ๊ฐ์, ๊ฐ๋ณ์ ์์ฑํ ํ์๋ ๋ณ๊ฒฝํ ์ ์๋ ๊ฐ์ ์๋ฏธํ๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์์ ์์ํ ๋ฐ์ดํฐ ํ์ ์ด ๋ถ๋ณ์ฑ์ ๊ฐ์ง๋ฉฐ, ์ฐธ์กฐํ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ๋ณ์ฑ์ ๊ฐ์ง๋ค.
๋ถ๋ณ์ ์ธ ์ฌ์ฉ ๋ฐฉ์์ ์์๋ฅผ ์ํํ ๋๋ง๋ค ๊ธฐ์กด ๋์ ๊ฐ์ ๋ณ๊ฒฝํ์ง ์๊ณ ํญ์ ์๋ก์ด ๊ฐ์ฒด๋ ๋ฐฐ์ด์ ์์ฑํ๋ ๋ฐฉ์์ ๊ฐ๋ฆฌํจ๋ค. ๊ธฐ์กด ์ํ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ธฐ ๋๋ฌธ์ ์ฌ์ด๋ ์ดํํธ๋ฅผ ๋ฐฉ์งํ ์ ์๊ณ ๊ฐ๋ ์ฑ์ด ์ข์ ๋์ , ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์ฆ๊ฐํ ์ ์๋ ๋จ์ ์ด ์๋ค.
// Immutable
const doubledNumbers = [1, 2, 3].reduce((acc, cur) => {
return [...acc, cur * 2];
}, []);
๊ฐ๋ณ์ ์ธ ์ฌ์ฉ ๋ฐฉ์์ ๊ธฐ์กด ๋์ ๊ฐ์ ์ง์ ๋ณ๊ฒฝํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ง๋๋ ๋ฐฉ์์ ๊ฐ๋ฆฌํจ๋ค. ๊ธฐ์กด ๊ฐ์ฒด๋ ๋ฐฐ์ด์ ์ง์ ์์ ํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์ ์ ๋์ , ์ฝ๋ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๊ณ ์ฌ์ด๋ ์ดํํธ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์๋ค.
// Mutable
const doubledNumbers = [1, 2, 3].reduce((acc, cur) => {
acc.push(cur * 2);
return acc;
}, []);
๋ถ๋ณ์ฑ๊ณผ ๊ฐ๋ณ์ฑ ๊ฐ๊ฐ ์ฅ๋จ์ ์ด ์๊ธฐ ๋๋ฌธ์ ์ด๋ค ๋ฐฉ์์ด ํญ์ ์ณ๋ค๊ณ ๋จ์ ํ ์๋ ์๋ค. ๋ฐ์ดํฐ ์์ด ๋ง๊ณ ์ฑ๋ฅ์ด ์ค์ํ ๊ฒฝ์ฐ์ ๊ฐ๋ณ์ฑ์ ์ฌ์ฉํ๋ ๊ฒ ์ ๋ฆฌํ ์ ์๋ค. ๋ฐ๋ฉด, ์ฝ๋ ๊ฐ๋ ์ฑ์ด๋ ์ ์ง๋ณด์์ฑ์ด ์ค์ํ๋ค๋ฉด ๋ถ๋ณ์ฑ์ ๊ณ ๋ คํ ์ ์๋ค.
๋ ํผ๋ฐ์ค
- Array.reduce() is Goated ๐โจ
- Object.groupBy() - JavaScript | MDN
- Why Using Reduce() To Sequentially Resolve Promises Works | CSS-Tricks
๊ธ ์์ ์ฌํญ์ ๋ ธ์ ํ์ด์ง์ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ๋ฐ์๋ฉ๋๋ค. ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์
'๐ช Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[DevTools] ๋ฆฌ์กํธ ํ ์คํธ ํ๊ฒฝ(Vitest, React Testing Library) ๋ฐ CI ๊ตฌ์ถ
[DevTools] ๋ฆฌ์กํธ ํ ์คํธ ํ๊ฒฝ(Vitest, React Testing Library) ๋ฐ CI ๊ตฌ์ถ
2024.07.22 -
[JS] ์๋ฐ์คํฌ๋ฆฝํธ ์ ๊ท์์ผ๋ก ์ฒ ๋จ์ ๊ตฌ๋ถ์ ์ถ๊ฐํ๊ธฐ (๋จ์ด ๊ฒฝ๊ณ, ์ ํ๋ฐฉํ์)
[JS] ์๋ฐ์คํฌ๋ฆฝํธ ์ ๊ท์์ผ๋ก ์ฒ ๋จ์ ๊ตฌ๋ถ์ ์ถ๊ฐํ๊ธฐ (๋จ์ด ๊ฒฝ๊ณ, ์ ํ๋ฐฉํ์)
2024.07.18 -
[JS] ์๋ฐ์คํฌ๋ฆฝํธ Set ๊ฐ์ฒด์ ์งํฉ ์ฐ์ฐ ๋ฉ์๋ (๊ต์งํฉ, ํฉ์งํฉ ๋ฑ)
[JS] ์๋ฐ์คํฌ๋ฆฝํธ Set ๊ฐ์ฒด์ ์งํฉ ์ฐ์ฐ ๋ฉ์๋ (๊ต์งํฉ, ํฉ์งํฉ ๋ฑ)
2024.07.04 -
[Git] RSS ๊ธ ๋ฐํ ์(ํฐ์คํ ๋ฆฌ ๋ฑ) GitHub ์๋ ์ปค๋ฐ ๋ฐฉ๋ฒ
[Git] RSS ๊ธ ๋ฐํ ์(ํฐ์คํ ๋ฆฌ ๋ฑ) GitHub ์๋ ์ปค๋ฐ ๋ฐฉ๋ฒ
2024.07.03