๐ Array.prototype.reduce ( immutable )
reduce ๋ฉ์๋๋ ์์ ์ ํธ์ถํ ๋ฐฐ์ด์ ๋ชจ๋ ์์๋ฅผ ์ํํ๋ฉฐ ์ธ์๋ก ์ ๋ฌ๋ฐ์ ์ฝ๋ฐฑํจ์๋ฅผ ๋ฐ๋ณต ํธ์ถํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ฝ๋ฐฑ ํจ์์ ๋ฐํ๊ฐ์ ๋ค์ ์ํ ์์ ์ฝ๋ฐฑ ํจ์์ ์ฒซ๋ฒ์งธ ์ธ์๋ก ์ ๋ฌํ๋ฉด์ ์ฝ๋ฐฑ ํจ์๋ฅผ ํธ์ถํ์ฌ,
ํ๋์ ๊ฒฐ๊ณผ๊ฐ์ ๋ง๋ค์ด ๋ฐํํ๋ค.
// 1๋ถํฐ 4๊น์ง ๋์ ์ ๊ตฌํ๋ค.
// ์ซ์๋ผ๋ฆฌ ๊ฐ์ ๋ํ ๋๋ ์ด๊ธฐ๊ฐ์ 0์ผ๋ก ์ค์ ํ์ง ์์๋ ๊ฐ์ด ๋์ค์ง๋ง
// ๊ทธ๋๋! ๊ทธ๋๋! ์ด๊ธฐ๊ฐ์ ๋ฃ์ด์ฃผ๋ ๊ฒ ์ข๋ค.
const sum = [1, 2, 3, 4].reduce(
// ์ฝ๋ฐฑ ํจ์
(accumulator, currentvalue, index, array) => {
accumulator + currentvalue
},
// ์ด๊ธฐ๊ฐ
0);
console.log(sum); // 10
๐ reduce ๋ฉ์๋๋ ์ต๋ 2๊ฐ์ ์ธ์๋ฅผ ๋ฐ์ ์ ์๋ค.
01 ์ฝ๋ฐฑ ํจ์
02 ์ด๊ธฐ๊ฐ
๐ reduce ๋ฉ์๋์ ์ฝ๋ฐฑํจ์๋ ์ต๋ 4๊ฐ์ ์ธ์๋ฅผ ๋ฐ์ ์ ์๋ค.
01 ์ด๊ธฐ๊ฐ or ์ฝ๋ฐฑ ํจ์์ ์ด์ ๋ฐํ๊ฐ
02 reduce ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ฐฐ์ด์ ์์๊ฐ
03 reduce ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ฐฐ์ด์ ์ธ๋ฑ์ค
04 reduce ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ฐฐ์ด ์์ฒด ( this )
๐ ํ๊ท ๊ตฌํ๊ธฐ
const values = [1, 2, 3, 4, 5, 6];
const average = values.reduce((acc, cur, i, {length}) => {
// ๋ง์ง๋ง ์ํ๊ฐ ์๋๋ฉด
// ๋์ ๊ฐ์ ๋ฐํํ๊ณ
// ๋ง์ง๋ง ์ํ์ด๋ฉด
// ๋์ ๊ฐ์ ๋ฐฐ์ด ์์ ๊ฐ์๋ก ๋๋ ํ๊ท ๊ฐ์ ๋ฐํํ๋ค
return i === length - 1 ? (acc + cur) / length : acc + cur;
}, 0);
console.log(average); // 3.5
๋ณ๋ค๋ฅธ ๊ฐ์ฒด๊ฐ ์์ด๋ { length } ์
๋ฐฐ์ด์ ๊ธธ์ด๊ฐ ๋ด๊ฒจ์๋ ๊ฑธ ํ์ธํ ์ ์๋ค wow...
๐ ์ต๋๊ฐ ๊ตฌํ๊ธฐ
const values = [1, 2, 3, 4, 5];
const max = values.reduce((acc, cur) => (acc > cur ? acc : cur), 0);
console.log(max); // 5
// ๊ทธ๋ ์ง๋ง ... ์ต๋๊ฐ์ ๊ตฌํ ๋๋ reduce ๋ฉ์๋๋ณด๋ค โMath.max ๋ฉ์๋โ๊ฐ ๋ ์ง๊ด์ ์
let max1 = Math.max(...values);
// let max1 = Math.max.apply(null, values);
console.log(max); // 5
max ๊ฐ์ 5
๐ ์์์ ์ค๋ณต ํ์ ๊ตฌํ๊ธฐ
const fruits = ['banana', 'apple', 'orange', 'orange', 'apple'];
const count = fruits.reduce((acc, cur) => {
// ์ฒซ ๋ฒ์งธ ์ํ ์ acc๋ ์ด๊ธฐ๊ฐ์ธ {}์ด๊ณ , cur์ ์ฒซ ๋ฒ์งธ ์์์ธ 'banana'๋ค.
// ์ด๊ธฐ๊ฐ์ผ๋ก ์ ๋ฌ๋ฐ์ ๋น ๊ฐ์ฒด์ ์์๊ฐ์ธ cur์ ํ๋กํผํฐ ํค๋ก, ์์์ ๊ฐ์๋ฅผ ํ๋กํผํฐ ๊ฐ์ผ๋ก ํ ๋นํ๋ค.
// ๋ง์ฝ, ํ๋กํผํฐ ๊ฐ์ด undefined(์ฒ์ ๋ฑ์ฅํ๋ ์์)์ด๋ฉด ํ๋กํผํฐ ๊ฐ์ 1๋ก ์ด๊ธฐํํ๋ค.
acc[cur] = (acc[cur] || 0) + 1;
return acc;
}, {});
acc ๊ฐ ์ฝ๋ฐฑ ํจ์์์ ์ฌ์คํ ๋ณด์ฌ์ฃผ๋ ๋ถ๋ถ
โพ ๋ ผ๋ฆฌ ์ฐ์ฐ์ ' || ' ์ ์ฒด
๋ ผ๋ฆฌ OR ( expr1 || expr2 )
expr1์ true๋ก ๋ฐํํ ์ ์์ผ๋ฉด expr1์ ๋ฐํํ๋ค.
๊ทธ ์ธ์ ๊ฒฝ์ฐ์๋ expr2๋ฅผ ๋ฐํํ๋ค.
๋ถ๋ฆฌ์ธ ๊ฐ๊ณผ ํจ๊ป ์ฌ์ฉํ ๊ฒฝ์ฐ์๋ ํ๋๋ผ๋ ์ฐธ์ด๋ฉด true๋ฅผ, ๊ทธ ์ธ์๋ false๋ฅผ ๋ฐํํ๋ค.
๐ ์ค์ฒฉ ๋ฐฐ์ด ํํํ
const values = [1, [2, 3], 4, [5, 6]];
// concat์ ์ด๋ ๊ฒ 2์ค ๋ฐฐ์ด๊น์ง๋ง ๋ฒ๊ฒจ๋ผ ์ ์๋ค. ๊ทธ ์ด์์ ์๋
const flatten = values.reduce((acc, cur) => acc.concat(cur), []);
console.log(flatten); // [1, 2, 3, 4, 5, 6]
// ๊ทธ๋ ์ง๋ง !! ์ค์ฒฉ ๋ฐฐ์ด์ ํํํํ ๋๋ reduce ๋ฉ์๋๋ณด๋ค โflat ๋ฉ์๋โ๊ฐ ๋ ์ง๊ด์ ์
[1, [2, 3, 4, 5]].flat(); // [1, 2, 3, 4, 5]
[1, [2, 3, [4, 5]]].flat(2); // [1, 2, 3, 4, 5]
// ์ธ์ 2๋ ์ค์ฒฉ ๋ฐฐ์ด์ ํํํํ๊ธฐ ์ํ ๊น์ด ๊ฐ์ด๋ค wow ์ ๋ง ํธ๋ฆฌํ๋ค wow
๐ ์ค๋ณต ์์ ์ ๊ฑฐ
const values = [1, 2, 1, 3, 5, 4, 5, 3, 4, 4];
const result = values.reduce((acc, cur, i, arr) => {
// ์ํ ์ค์ธ ์์์ ์ฒซ ์ธ๋ฑ์ค๊ฐ ์์ ์ ์ธ๋ฑ์ค๋ผ๋ฉด, ์ฒ์ ์ํํ๋ ์์๋ค.
// ์ด ์์๋ง ์ด๊ธฐ๊ฐ์ผ๋ก ์ ๋ฌ๋ฐ์ ๋ฐฐ์ด์ ๋ด์ ๋ฐํํ๋ค.
// ์ํ ์ค์ธ ์์์ ์ฒซ ์ธ๋ฑ์ค๊ฐ ์์ ์ ์ธ๋ฑ์ค๊ฐ ์๋๋ผ๋ฉด ์ค๋ณต๋ ์์๋ค.
if(arr.indexOf(cur) === i) acc.push(cur);
return acc;
}, []);
console.log(result); // [1, 2, 3, 5, 4]
// ๊ทธ๋ ์ง๋ง !! ์ค๋ณต ์์๋ฅผ ์ ๊ฑฐํ ๋๋ reduce ๋ฉ์๋๋ณด๋ค โfilter ๋ฉ์๋โ๊ฐ ๋ ์ง๊ด์ ์
const result = values.filter((v, i, arr) => arr.indexOf(v) === i);
console.log(result); // [1, 2, 3, 5, 4]
// ๋๋ ! ์ค๋ณต๋์ง ์๋ ์ ์ผํ ๊ฐ๋ค์ ์งํฉ์ธ โSetโ์ ์ฌ์ฉํ ์๋ ์์
// ์ค๋ณต ์์๋ฅผ ์ ๊ฑฐํ ๋, ์ด ๋ฐฉ๋ฒ์ ์ถ์ฒ์ถ์ฒ ?ใ
<
const result1 = [...new Set(values)];
console.log(result1); // [1, 2, 3, 5, 4]
indexOf( ) ๋ฉ์๋๋๊น ์ด๊ฒ ๊ฐ๋ฅํ๊ฑฐ๋ค ~!~!
โ reduce ๋ฉ์๋ ํธ์ถํ ๋ ์ฃผ์ํ ์
โ ์ธ์ ๋ ์ด๊ธฐ๊ฐ์ ์ ๋ฌํ๋ ๊ฒ์ด ์์ ํ๋ค.
// reduce ๋ฉ์๋์ ๋ ๋ฒ์งธ ์ธ์, ์ฆ ์ด๊ธฐ๊ฐ์ ์๋ตํจ
const sum = [1, 2, 3, 4].reduce((acc,cur) => acc + cur);
console.log(sum); // 10
๊ทธ๋๋ ์ํ๋ ๊ฐ์ด ๋์ค๊ธด ๋์จ๋ค. ํ์ง๋ง ๊ฒฝ์ฐ์ ์๊ฐ ํ์ ์ ์.
const sum1 = [].reduce((acc, cur) => acc + cur);
// Uncaught TypeError: Reduce of empty array with no initial value
์ด๊ธฐ๊ฐ์ ์ค์ ํ์ง ์์ผ๋ฉด ์ด๋ ๊ฒ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
const sum2 = [].reduce((acc, cur) => acc + cur, 0);
console.log(sum); // 0
์ด๊ธฐ๊ฐ์ ์ค์ ํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์๊ณ , ์ํ๋ ๊ฐ์ด ๋์จ๋ค.
โ ์ด๊ฑด ๋ด๊ฐ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ๋ฅผ ํ๋ฉด์๋ ๋ถ๋ช์ณค๋ ๋ถ๋ถ โ
์ด๊ฑด ๋๊ณ ์ ์ ๊ฑด ์๋๋ ๊ณ ๋ฏผํ๋ ๋ถ๋ถ ใ ใ
ํด์๋์๋ฐ !!
const products = [
{ id: 1, price: 100 },
{ id: 2, price: 200 },
{ id: 3, price: 300 }
];
const priceSum = products.reduce((acc, cur) => acc.price + cur.price);
// ์ฒซ๋ฒ์งธ ์ํ : acc๋ { id: 1, price: 100 }, cur์ { id: 2, price: 200 }์ด๋ค.
// ๋๋ฒ์งธ ์ํ : acc๋ 300 , cur์ { id: 3, price: 300 }์ด๋ค.
// ๋๋ฒ์งธ ์ํ : acc์ ํจ์ ๊ฐ์ฒด๊ฐ ์๋ ์ซ์๊ฐ์ด ์ ๋ฌ๋๋ค. ์ด๋ acc.price๋ undefined๋ค.
console.log(priceSum); // NaN
์ด์ฒ๋ผ โ๊ฐ์ฒด ํ๋กํผํฐ ๊ฐ์ ํฉ์ฐํ๋ ๊ฒฝ์ฐโ์๋ ๋ฐ๋์ ์ด๊ธฐ๊ฐ์ ์ ๋ฌํด์ผํ๋ค.
๋ฌผ๋ก ๊ทธ ์ธ์๋ ์ด๊ธฐ๊ฐ ๊ผญ๊ผญ ์ ์ด์ฃผ์ โญโญโญ
const products = [
{ id: 1, price: 100 },
{ id: 2, price: 200 },
{ id: 3, price: 300 }
];
const priceSum = products.reduce((acc, cur) => acc + cur.price, 0);
// ์ฒซ๋ฒ์งธ ์ํ : acc๋ 0 , cur์ { id: 1, price: 100 }์ด๋ค.
// ๋๋ฒ์งธ ์ํ : acc๋ 100, cur์ { id: 2, price: 200 }์ด๋ค.
// ๋๋ฒ์งธ ์ํ : acc๋ 300, cur์ { id: 3, price: 300 }์ด๋ค.
console.log(priceSum); // 600
'Front-end > JS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์๋ฐ์คํฌ๋ฆฝํธ ๋ฐฐ์ด ๊ณ ์ฐจํจ์ forEach / map (0) | 2021.08.23 |
---|---|
์๋ฐ์คํฌ๋ฆฝํธ ๋ฐฐ์ด ๋ฉ์๋ Array Method (๊ณ์ ์ถ๊ฐ์ค) (0) | 2021.08.21 |
์๋ฐ์คํฌ๋ฆฝํธ ๋ฌธ์ ๊ฐ์ฒด ๋ชจ๋ธ DOM (Document Object Model) (0) | 2021.08.14 |
์๋ฐ์คํฌ๋ฆฝํธ ๋ฐฐ์ด Array (0) | 2021.08.13 |
์๋ฐ์คํฌ๋ฆฝํธ ์์ ํ์ & ๊ฐ์ฒด ํ์ Primitive type & Reference type (0) | 2021.08.12 |
๋๊ธ