μλ°μ€ν¬λ¦½νΈ λ°°μ΄ κ³ μ°¨ν¨μ reduce
π 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