How to Use Map, Filter, & Reduce in JavaScript - Lee-hyuna/33-js-concepts-kr GitHub Wiki
How to Use Map, Filter, & Reduce in JavaScript
λ²μ : https://code.tutsplus.com/tutorials/how-to-use-map-filter-reduce-in-javascript--cms-26209
μμ¦ κ°λ° λμκ΅μμλ ν¨μν νλ‘κ·Έλλ°μ΄ μλΉν μΈκΈ°λ₯Ό μ»κ³ μμ΅λλ€. κ·Έλ¦¬κ³ μ λΉν μ΄μ κ° μμ΅λλ€ : ν¨μν κΈ°μ μ νλμ μ΄ν΄νκΈ° μ¬μ΄ μ μΈμ μ½λλ₯Ό μμ±νκ³ λ¦¬ν©ν°λ§νκ³ ν μ€νΈνλ λ° λμμ΄λ©λλ€.
ν¨μν νλ‘κ·Έλλ°μ μ΄μ μ€ νλλ λͺ©λ‘ λ° λͺ©λ‘ μμ μ νΉμνκ² μ¬μ©νλ κ²μ λλ€. κ·Έλ¦¬κ³ κ·Έλ¬ν κ²λ€μ λ§μΉ κ·Έλ€μ΄ κ°μ§κ³ μλ κ²κ³Ό κ°μ μ리μ λλ€ : λ°°μ΄ λ κ²λ€, κ·Έλ¦¬κ³ λΉμ μ΄ κ·Έλ€μκ²νλ κ²λ€. κ·Έλ¬λ κΈ°λ₯μ μ¬κ³ λ°©μμ μμλ³΄λ€ μ‘°κΈ λ€λ₯΄κ² μ²λ¦¬ν©λλ€.
μ΄ κΈ°μ¬μμλ map
, filter
, reduce
κ³Ό κ°μ λͺ©λ‘ μ‘°μμ μμΈν μ΄ν΄ λ³΄κ² μ΅λλ€. μ΄ μΈ κ°μ§ κΈ°λ₯μ λν΄ λ¨Έλ¦¬λ₯Ό κ°μΈλ κ²μ κΉ¨λν κΈ°λ₯ μ½λλ₯Ό μμ±νλ λ°μμ΄ μ€μν λ¨κ³μ΄λ©° κΈ°λ₯μ λ° λ°μμ± νλ‘κ·Έλλ°μ κ°λ ₯ν κΈ°μ μ λν λ¬Ένλ₯Ό μ΄μ΄μ€λλ€.
λνfor
루νλ₯Ό λ€μ μμ±ν νμκ° μλ€λ κ²μ μλ―Έν©λλ€.
μ΄μνκ°? λ€μ΄κ°μ.
A Map From List to List
μ’ μ’ μ°λ¦¬λ λ°°μ΄μ κ°μ Έ μμ μ νν κ°μ λ°©μμΌλ‘ λ°°μ΄μ μμ ν΄μΌ ν νμκ° μμ΅λλ€. μΌλ°μ μΈ μλ μ«μ λ°°μ΄μμ λͺ¨λ μμλ₯Ό ββμ κ³±νκ±°λ, μ¬μ©μ λͺ©λ‘μμ μ΄λ¦μ κ²μνκ±°λ, λ¬Έμμ΄ λ°°μ΄μ λν΄ μ κ·μμ μ€ννλ κ²μ λλ€.
map
μ μ νν κ·Έλ κ²νλλ‘ λ§λ€μ΄μ§ λ©μλμ
λλ€. κ·Έκ²μArray.prototype
μ μ μλμ΄ μμΌλ―λ‘ μ΄λ€ λ°°μ΄μμλ νΈμΆ ν μ μμΌλ©° 첫 λ²μ§Έ μΈμλ‘ μ½λ°±μ νμ©ν©λλ€.
λ°°μ΄μμmap
μ νΈμΆνλ©΄, μ½λ°±μ΄ λ°ν ν λͺ¨λ κ°μ κ°μ§ new λ°°μ΄μ λ°ννλ©΄μ λ°°μ΄ λ΄μ λͺ¨λ μμμ λν΄ μ½λ°±μ μ€νν©λλ€.
νλμμmap
μ μ½λ°±μ μΈ κ°μ§ μΈμλ₯Ό μ λ¬ν©λλ€.
- λ°°μ΄μ current item
- νμ¬ νλͺ©μ array μΈλ±μ€
- map onμ΄λΌλ entire λ°°μ΄
λͺ κ°μ§ μ½λλ₯Ό μ΄ν΄ λ³΄κ² μ΅λλ€.
map
in Practice
λΉμΌμ μμ
λ°°μ΄μ κ΄λ¦¬νλ μ±μ΄ μλ€κ³ κ°μ ν΄ λ³΄κ² μ΅λλ€. κ°task
λname
κ³Όduration
μμ±μ κ°μ§ κ°μ²΄μ
λλ€ :
// Durations are in minutes
var tasks = [
{
'name' : 'Write for Envato Tuts+',
'duration' : 120
},
{
'name' : 'Work out',
'duration' : 60
},
{
'name' : 'Procrastinate on Duolingo',
'duration' : 240
}
];
κ° μμ
μ μ΄λ¦λ§μΌλ‘ μλ‘μ΄ λ°°μ΄μ λ§λ€κ³ μΆλ€λ©΄ μ°λ¦¬κ° μ§κΈκΉμ§ ν΄ μ¨ λͺ¨λ κ²μ μ΄ν΄λ³Ό μ μμ΅λλ€. for
루νλ₯Ό μ¬μ©νλ©΄ λ€μκ³Ό κ°μ΄ μμ±ν μ μμ΅λλ€ :
var task_names = [];
for (var i = 0, max = tasks.length; i < max; i += 1) {
task_names.push(tasks[i].name);
}
JavaScriptλ λν forEach 루νλ₯Ό μ 곡ν©λλ€. for
루νμ κ°μ κΈ°λ₯μ ν©λλ€λ§, μ°λ¦¬λ₯Ό μν΄ λ°°μ΄ κΈΈμ΄μ λν 루ν μΈλ±μ€λ₯Ό κ²μ¬νλ λͺ¨λ λμ λ₯Ό κ΄λ¦¬ν©λλ€ :
var task_names = [];
tasks.forEach(function (task) {
task_names.push(task.name);
});
map
μ μ¬μ©νμ¬ λ€μκ³Ό κ°μ΄ μμ±ν μ μμ΅λλ€ :
var task_names = tasks.map(function (task, index, array) {
return task.name;
});
index
μarray
λ§€κ° λ³μλ₯Ό ν¬ν¨μμΌ νμνλ€λ©΄ κ±°κΈ°μ μμμ μκΈ°μν΅λλ€. λ΄κ° μ¬κΈ°μ κ·Έκ²λ€μ μ¬μ©νμ§ μμκΈ° λλ¬Έμ, λΉμ μ κ·Έκ²λ€μ λ²λ¦΄ μ μμκ³ , μ½λλ μ λμ ν κ²μ
λλ€.
λ κ°μ§ μ κ·Ό λ°©μ κ°μλ λͺ κ°μ§ μ€μν μ°¨μ΄μ μ΄ μμ΅λλ€.
1.map
μ μ¬μ©νλ©΄for
루νμ μνλ₯Ό μ§μ κ΄λ¦¬ ν νμκ° μμ΅λλ€.
2. λ°°μ΄μ μμΈμ μ§μ νμ§ μκ³ μμλ₯Ό μ§μ μ‘°μ ν μ μμ΅λλ€.
3. μ λ°°μ΄μ λ§λ€κ³ κ·Έ μμ 'λ°μ΄ λ£κΈ°'ν νμκ° μμ΅λλ€. map
μ μμ± λ μ νμ λͺ¨λ ν λ²μ λ°ννκΈ° λλ¬Έμ λ°ν κ°μ μ λ³μμ κ°λ¨νκ² ν λΉ ν μ μμ΅λλ€.
4. λΉμ μ μ½λ°±μreturn
λ¬Έμ ν¬ν¨ν΄μΌνλ€λ κ²μ κΈ°μ΅ν΄μΌν©λλ€. κ·Έλ μ§ μμΌλ©΄undefined
λ‘ μ±μμ§ μλ‘μ΄ λ°°μ΄μ μ»κ² λ κ²μ
λλ€.
μ°λ¦¬κ° μ€λ λ³Ό μμλ κΈ°λ₯λ€ λͺ¨λκ° μ΄λ¬ν νΉμ§λ€μ 곡μ νκ³ μμ΅λλ€.
루νμ μνλ₯Ό μλμΌλ‘ κ΄λ¦¬ ν νμκ° μμΌλ―λ‘ μ½λκ° λ κ°λ¨νκ³ μ μ§ κ΄λ¦¬κ° μ½μ΅λλ€. λ°°μ΄λ‘ μμΈμ μμ±νλ λμ μμμμ μ§μ μλ ν μ μλ€λ μ¬μ€μ λ΄μ©μ λ μ½κΈ° μ½κ² λ§λλλ€.
forEach
루νλ₯Ό μ¬μ©νλ©΄ μ΄λ¬ν λ¬Έμ λ₯Ό λͺ¨λ ν΄κ²°ν μ μμ΅λλ€. κ·Έλ¬λμ§λ
λ μ¬μ ν μ μ΄λ λ κ°μ§ λλ ·ν μ₯μ μ κ°μ§κ³ μλ€.
1.forEach
λundefined
λ₯Ό 리ν΄νλ―λ‘ λ€λ₯Έ λ°°μ΄ λ©μλμ μ°κ²°λμ§ μμ΅λλ€. map
μ λ°°μ΄μ λ°ννκΈ° λλ¬Έμ λ€λ₯Έ λ°°μ΄ λ©μλμ μ°μ ν μ μμ΅λλ€.
2.map
μ 루ν μμ λ°°μ΄μ λ³κ²½μν€μ§ μκ³ μμ± λ μ νμ κ°μ§ λ°°μ΄μ λ°νν©λλ€.
μνλ₯Ό μμ νλ μ₯μμ μλ₯Ό μ΅μνμΌλ‘ μ μ§νλ κ²μ κΈ°λ₯ νλ‘κ·Έλλ°μ μ€μν κ΅λ¦¬μ λλ€. λ μμ νκ³ μ΄ν΄νκΈ° μ¬μ΄ μ½λλ₯Ό λ§λλλ€.
μ΄μ λ λ Έλμμλ κ²½μ° Firefox λΈλΌμ°μ μ½μμμ μ΄λ¬ν μμ λ₯Ό ν μ€νΈνκ±°λ Babel λλ Traceurλ₯Ό μ¬μ©νμ¬ ν μ€νΈ ν΄λ³΄μμμ€. ), ES6 νμ΄ν ν¨μλ₯Ό μ¬μ©νμ¬λ³΄λ€ κ°κ²°νκ² μμ±ν μ μμ΅λλ€.
var task_names = tasks.map((task) => task.name );
Arrow ν¨μλ ν μ€μ§λ¦¬λ‘return
ν€μλλ₯Ό μλ΅ ν μμκ²ν©λλ€.
κ·Έκ²λ³΄λ€ ν¨μ¬ λ μ½κΈ° μ½μ§ μμ΅λλ€.
Gotchas
map
μ μ λ¬ν μ½λ°±μ λͺ
μ μ μΌλ‘return
λ¬Έμ κ°μ ΈμΌν©λλ€. κ·Έλ μ§ μμΌλ©΄map
μundefined
λ‘ κ°λ μ°¬ λ°°μ΄μ μΆλ ₯ν©λλ€. `return 'κ°μ ν¬ν¨νλ κ²μ κΈ°μ΅νλ κ²μ μ΄λ ΅μ§ μμ§λ§ μμ§ μλ κ²μ΄ μ’μ΅λλ€.
μμ΄ λ²λ¦¬λ©΄ map
μ λΆννμ§ μμ΅λλ€. λμ , κ·Έκ²μ μ무 κ²λμλ λ°°μ΄μ μ‘°μ©ν λλ € μ€ κ²μ
λλ€. μ΄μ κ°μ μ¬μΌλ°νΈ μ€λ₯λ λλΌ μΈ μ λλ‘ λλ²κΉ
νκΈ°κ° μ΄λ ΅μ΅λλ€.
λ€ννλ, μ΄κ²μ map
μ κ°μ§ only gotchaμ
λλ€. κ·Έλ¬λ κ·Έκ²μ λ΄κ° κ°μ‘°ν΄μΌ ν 곡ν΅μ μΈ ν¨μ μ
λλ€ : νμ μ½λ°±μreturn
λ¬Έμ΄ μλμ§ νμΈνμμμ€!
Implementation
ꡬνμ μ½λ κ²μ μ΄ν΄μ μ€μν λΆλΆμ
λλ€. λ°λΌμ, νλμμ λ¬΄μ¨ μΌμ΄ λ²μ΄μ§κ³ μλμ§λ³΄λ€ μ μ΄ν΄ν μ μλλ‘ κ°λ²Όμ΄map
μ μμ±ν΄ λ΄
μλ€. νλ‘λμ
μμ€μ ꡬνμ λ³΄λ €λ©΄ [Mozillaμ MDNμμμ polyfill] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map)μ νμΈνμμμ€.
var map = function (array, callback) {
var new_array = [];
array.forEach(function (element, index, array) {
new_array.push(callback(element));
});
return new_array;
};
var task_names = map(tasks, function (task) {
return task.name;
});
μ΄ μ½λλ λ°°μ΄κ³Ό μ½λ°± ν¨μλ₯Ό μΈμλ‘ λ°μλ€μ
λλ€. κ·Έλ° λ€μ μ λ°°μ΄μ λ§λλλ€. 건λ€λ°μ λ°°μ΄μ κ° μμμ λν΄ μ½λ°±μ μ€νν©λλ€. κ²°κ³Όλ₯Ό μ λ°°μ΄λ‘ νΈμν©λλ€. μ λ°°μ΄μ λ°νν©λλ€. μ½μμμ μ΄κ²μ μ€ννλ©΄ μ΄μ κ³Ό κ°μ κ²°κ³Όλ₯Ό μ»κ²λ©λλ€. ν
μ€νΈνκΈ° μ μtasks
λ₯Ό μ΄κΈ°νν΄μΌν©λλ€!
νλμμ for 루νλ₯Ό μ¬μ©νλ λμ ν¨μμ λννλ©΄ μΈλΆ μ λ³΄κ° μ¨κ²¨μ§κ³ λμ μΆμν μμ μ μν ν μ μμ΅λλ€.
λ°λΌμ μ½λλ₯Ό λ μ μΈμ μΌλ‘ λ§λλλ€. μ¦, μ΄λ»κ² ν κ²μΈκ°? μΌλ§λ λ μ½κΈ° μ½κ³ , μ μ§ λ³΄μκ° μλλμ§, erm, debuggable μ΄κ²μ΄ μ½λλ₯Ό λ§λ€ μ μλμ§λ₯Ό μκ² λ κ²μ λλ€.
Filter Out the Noise
λ€μ λ°°μ΄ μ°μ°μfilter
μ
λλ€. κ·Έκ²μ μ νν κ°μ μ리λ₯Όλ
λλ€ : κ·Έκ²μ λ°°μ΄μ νμλ‘νκ³ λΆνμν μμλ₯Ό κ±Έλ¬λ
λλ€.
map
κ³Ό λ§μ°¬κ°μ§λ‘filter
λ Array.prototype
μ μ μλμ΄ μμ΅λλ€. μ΄λ€ λ°°μ΄μμλ μ¬μ©ν μ μμΌλ©° 첫 λ²μ§Έ μΈμλ‘ μ½λ°±μ μ λ¬ν©λλ€. filter
λ λ°°μ΄μ κ° μμμ λν΄ μ½λ°±μ μ€ννκ³ μ½λ°±μ΄true
λ₯Ό λ°ν ν μμ λ§ only ν¬ν¨νλ new λ°°μ΄μ μΆλ ₯ν©λλ€.
λνmap
κ³Ό κ°μ΄filter
λ μ½λ°± μΈμ μΈ κ°λ₯Ό λκΉλλ€ :
- current item
- current μμΈ
- λΉμ μ΄`filter 'λΌκ³ λΆλ λ array
filter
in Practice
μ°λ¦¬μ μμ μμ λ₯Ό λ€μ μ΄ν΄ λ³΄κ² μ΅λλ€. κ° μμ μ μ΄λ¦μ κΊΌλ΄λ λμ , μμ μ μλ£νλ λ° 2 ββμκ° μ΄μ 걸리λ μμ λͺ©λ‘μ μ»κ³ μΆλ€κ³ ν©μλ€.
forEach
λ₯Ό μ¬μ©νλ©΄ λ€μκ³Ό κ°μ΄ μΈ μ μμ΅λλ€.
var difficult_tasks = [];
tasks.forEach(function (task) {
if (task.duration >= 120) {
difficult_tasks.push(task);
}
});
With filter
:
var difficult_tasks = tasks.filter(function (task) {
return task.duration >= 120;
});
// Using ES6
var difficult_tasks = tasks.filter((task) => task.duration >= 120 );
μ¬κΈ°μλ μ½λ°±μ λνindex
μarray
μΈμλ₯Ό μ¬μ©νμ§ μμκΈ° λλ¬Έμ μλ΅νμ΅λλ€.
map
κ³Ό κ°μ΄,filter
λ μ°λ¦¬μκ² λ€μμ νλ½ν©λλ€ :
- forEach λλ for 루ν λ΄μμ λ°°μ΄μ λ³κ²½νλ κ²μ νΌνμμμ€
- λ€λ₯Έ κ³³μμ μ μν λ°°μ΄λ‘ νΈμν기보λ€λ κ²°κ³Όλ₯Ό μ λ³μμ μ§μ ν λΉν©λλ€.
Gotchas
map
μ μ λ¬ν μ½λ°±μ μ λλ‘ μλνλ €λ©΄ return λ¬Έμ ν¬ν¨ν΄μΌν©λλ€. filter
λ₯Ό μ¬μ©νλ©΄ return λ¬Έλ ν¬ν¨μμΌμΌνλ©° λ°λμ λΆμΈ κ°μ λ°νν΄μΌν©λλ€.
return λ¬Έμ μμ΄ λ²λ¦¬λ©΄ μ½λ°±μundefined
λ₯Ό λ°ν ν κ²μ΄κ³ ,filter
λ λμμ΄λμ§ μμ μ λλ‘false
λ₯Ό κ°μν©λλ€. μ€λ₯λ₯Ό λμ§λ λμ λΉ λ°°μ΄μ μ‘°μ©ν λ°νν©λλ€!
λ€λ₯Έ κ²½λ‘λ‘ κ°μ λͺ μ μ μΌλ‘ 'true'λλ 'false'κ° μλ κ²μ λ°ννλ©΄ 'filter'λ JavaScript's coercion rulesμ μ μ©νμ¬ μλ―Έλ₯Ό νμ νλ €κ³ μλν©λλ€. μ’ μ’ μ΄κ²μ λ²κ·Έμ λλ€. κ·Έλ¦¬κ³ κ·νμ μ κ³ μλ₯Ό μμ΄ λ²λ¦¬λ κ²κ³Ό λ§μ°¬κ°μ§λ‘, κ·Έκ²μ μ‘°μ©ν κ²μ λλ€.
νμ μ½λ°±μ λͺ
μμ μΈ return λ¬Έμ΄ ν¬ν¨λμ΄ μλμ§ νμΈνμμμ€. κ·Έλ¦¬κ³ νμ _ νν° _μ μ½λ°±μ΄true
λλfalse
λ₯Ό 리ν΄νλμ§ νμΈνμμμ€. λΉμ μ μ¨κ±΄ν¨μ΄ λΉμ μκ² κ°μ¬ ν κ²μ
λλ€.
Implementation
λ€μ ν λ², μ½λλ₯Ό μ΄ν΄νλ κ°μ₯ μ’μ λ°©λ²μ ... κΈμ, κ·Έκ²μ μ°λ κ²μ λλ€. μ°λ¦¬ μμ μ κ²½λ`νν° 'λ₯Ό κ΅΄λ € 보μ. Mozillaμ μ’μ μ¬λλ€μ μ°μ κ°λμ polyfillλ μ½μ μ μμ΅λλ€.
var filter = function (array, callback) {
var filtered_array = [];
array.forEach(function (element, index, array) {
if (callback(element, index, array)) {
filtered_array.push(element);
}
});
return filtered_array;
};
Reducing Arrays
map
μ λ°°μ΄μ λͺ¨λ μμλ₯Ό κ°λ³μ μΌλ‘ λ³ννμ¬ μλ‘μ΄ λ°°μ΄μ λ§λλλ€. filter
λ μνμ§ μλ μμλ₯Ό μ κ±°νμ¬ μλ‘μ΄ λ°°μ΄μ λ§λλλ€. ννΈ,reduce
λ λ°°μ΄μ λͺ¨λ μμλ₯Ό ββμ·¨νκ³ κ·Έκ²λ€μ λ¨μΌ κ°μΌλ‘ λ§λλλ€.
map
κ³Όfilter
μ λ§μ°¬κ°μ§λ‘,reduce
λArray.prototype
μ μ μλμ΄ μμΌλ―λ‘ μ΄λ€ λ°°μ΄μμλ μ¬μ©ν μ μμ΅λλ€. μ½λ°±μ 첫 λ²μ§Έ μΈμλ‘ μ λ¬ν©λλ€. κ·Έλ¬λ μ νμ μΈ λ λ²μ§Έ μΈμ, μ¦ λͺ¨λ λ°°μ΄ μμλ₯Ό κ²°ν©νκΈ°μν κ°λ νμν©λλ€.
reduce
λ λ€ μ½λ°±μ μ λ¬ν©λλ€ :
- _current κ° _
- μ΄μ κ° _
- _ νμ¬ μμΈ _
- λΉμ μ΄
reduce
λΌκ³ λΆλ₯Έ array
μ½λ°±μ κ° λ°λ³΅λ§λ€ _ μ΄μ κ° _μ μ»μ΅λλ€. 첫 λ²μ§Έ λ°λ³΅μλ μ΄μ κ°μ΄ μμ΅λλ€. μ΄κ²μ΄ μ΄κΈ° κ°μ`reduce 'ν μμλ μ΄μ μ λλ€. 첫 λ²μ§Έ λ°λ³΅μ λν "μ΄μ κ°"μΌλ‘ μ¬μ©λ©λλ€. κ·Έλ μ§ μμΌλ©΄ 첫 λ²μ§Έ λ°λ³΅μλ "μ΄μ κ°"μΌλ‘ μ¬μ©λ©λλ€.
λ§μ§λ§μΌλ‘,reduce
λ λ¨μΌ κ°μ λ°ννκ³ , λ¨μΌ νλͺ©μ ν¬ν¨νλ λ°°μ΄μ μλλΌλ κ²μ λͺ
μ¬νμμμ€. μ΄κ²μ λ³΄μΌ μλμλ κ²λ³΄λ€ λ μ€μν©λλ€. μμ μμ λ€μ μ΄ν΄ λ³΄κ² μ΅λλ€.
reduce
in Practice
`reduce 'λ μ¬λλ€μ΄ μ²μμλ κ°μ₯ μΈκ³μΈμ΄λΌκ³ λλΌλ κΈ°λ₯μ΄κΈ° λλ¬Έμ κ°λ¨ν λ¨κ³λ₯Ό κ±°μ³ λ¨κ³λ³λ‘ κ±·κΈ° μμν κ²μ λλ€.
μ°λ¦¬κ° μ«μ λͺ©λ‘μ ν©μ μ°Ύκ³ μΆλ€κ³ ν©μλ€. 루νλ₯Ό μ¬μ©νλ©΄ λ€μκ³Ό κ°μ΄ 보μ λλ€.
var numbers = [1, 2, 3, 4, 5],
total = 0;
numbers.forEach(function (number) {
total += number;
});
μ΄κ²μ΄ forEachμ λμ μ¬μ© μ¬λ‘λ μλμ§λ§,reduce
λ μ¬μ ν μ°λ¦¬κ° λμ°λ³μ΄λ₯Ό νΌν μμκ² ν΄μ£Όλ μ₯μ μ΄ μμ΅λλ€. reduce
λ₯Ό μ¬μ©νλ©΄ λ€μκ³Ό κ°μ΄ μΈ μ μμ΅λλ€ :
var total = [1, 2, 3, 4, 5].reduce(function (previous, current) {
return previous + current;
}, 0);
μ°μ , μ°λ¦¬λnumbers
μ λͺ©λ‘μμ reduce
λ₯Ό νΈμΆν©λλ€. μ΄μ κ°κ³Ό νμ¬ κ°μ μΈμλ‘ λ°μλ€μ΄λ μ½λ°±μ μ λ¬νκ³ μ΄λ₯Ό λν κ²°κ³Όλ₯Ό 리ν΄ν©λλ€. reduce
μ λ λ²μ§Έ μΈμλ‘0
μ μ λ¬ νμΌλ―λ‘ μ²« λ²μ§Έ λ°λ³΅μμprevious
μ κ°μΌλ‘ μ¬μ©ν©λλ€.
λ¨κ³λ³λ‘ μ΄ν΄λ³΄λ©΄ λ€μκ³Ό κ°μ΄ 보μ λλ€.
Iteration | Previous | Current | Total |
---|---|---|---|
1 | 0 | 1 | 1 |
2 | 1 | 2 | 3 |
3 | 3 | 3 | 6 |
4 | 6 | 4 | 10 |
5 | 10 | 5 | 15 |
ν μ΄λΈ ν¬μ΄λΌλ©΄ μ½μμμ λ€μ μ½λλ₯Ό μ€ννμμμ€.
var total = [1, 2, 3, 4, 5].reduce(function (previous, current, index) {
var val = previous + current;
console.log("The previous value is " + previous +
"; the current value is " + current +
", and the current iteration is " + (index + 1));
return val;
}, 0);
console.log("The loop is done, and the final value is " + total + ".");
λ€μ μμ½νμλ©΄ :reduce
λ λ°°μ΄μ λͺ¨λ μμλ₯Ό ββλ°λ³΅νκ³ μ½λ°±μ μ§μ νμ§λ§ λ°°μ΄μ κ²°ν©ν©λλ€. λͺ¨λ λ°λ³΅μμ μ½λ°±μ total-so-far λλ accumulated value μΈ previous _value_μ μ‘μΈμ€ ν μ μμ΅λλ€. _ νμ¬ κ° _; _current μΈλ±μ€; _ λ° array μ 체 (νμν κ²½μ°).
μ°λ¦¬μ μμ
μμ λ‘ λμκ° λ³΄κ² μ΅λλ€. μ°λ¦¬λmap
μ μμ
μ΄λ¦ λͺ©λ‘κ³Ό νν°λ₯Ό μ¬μ©νμ¬ μ€λ μκ°μ΄ κ±Έλ¦° μμ
λͺ©λ‘μ νν°λ§νμ΅λλ€.
μ°λ¦¬κ° μ€λ μΌνλ λ° μλΉ ν μ΄ μκ°μ μκ³ μΆλ€λ©΄ μ΄λ»κ²ν΄μΌν κΉμ?
forEach
루νλ₯Ό μ¬μ©νλ©΄ λ€μκ³Ό κ°μ΄ μΈ μ μμ΅λλ€ :
var total_time = 0;
tasks.forEach(function (task) {
// The plus sign just coerces
// task.duration from a String to a Number
total_time += (+task.duration);
});
reduce
λ₯Ό μ¬μ©νλ©΄ λ€μκ³Ό κ°μ΄λ©λλ€.
var total_time = tasks.reduce(function (previous, current) {
return previous + current;
}, 0);
// Using arrow functions
var total_time = tasks.reduce((previous, current) previous + current );
μ¬μ΄.
κ±°μ μ λΆμ
λλ€. κ±°μ JavaScriptλreduceRight
λΌκ³ νλ μλ €μ§μ§ μμ λ©μλλ₯Ό μ 곡ν©λλ€. μμ μμ μμ reduce
λ λ°°μ΄μ first νλͺ©μμ μμνμ¬ μΌμͺ½μμ μ€λ₯Έμͺ½μΌλ‘ λ°λ³΅λ©λλ€.
var array_of_arrays = [1, 2], [3, 4], [5, 6](/Lee-hyuna/33-js-concepts-kr/wiki/1,-2],-[3,-4],-[5,-6);
var concatenated = array_of_arrays.reduce( function (previous, current) {
return previous.concat(current);
});
console.log(concatenated); // [1, 2, 3, 4, 5, 6];
reduceRight
λ κ°μ μΌμνμ§λ§ λ°λ λ°©ν₯μΌλ‘ :
var array_of_arrays = [1, 2], [3, 4], [5, 6](/Lee-hyuna/33-js-concepts-kr/wiki/1,-2],-[3,-4],-[5,-6);
var concatenated = array_of_arrays.reduceRight( function (previous, current) {
return previous.concat(current);
});
console.log(concatenated); // [5, 6, 3, 4, 1, 2];
λλ 맀μΌreduce 'λ₯Ό μ¬μ©νμ§λ§, κ²°μ½
reduceRight`λ₯Ό νμλ‘νμ§λ μμ΅λλ€. λλ λΉμ λ μλ§ κ·Έλ μ§ μλ€κ³ μκ°ν©λλ€. κ·Έλ¬λ λΉμ μ΄ ν λ² ν΄λ³΄μ λ€λ©΄, μ΄μ λΉμ μ κ·Έκ²μ΄ μμμ μ μ μμ΅λλ€.
Gotchas
reduce
κ°μλ μΈ κ°μ§ ν° μ‘νλ λ€μκ³Ό κ°μ΅λλ€.
- 'λμ κ°κΈ°'λ₯Ό μμ΄ λ²λ¦Ό
- μ΄κΈ° κ° μμ΄ λ²λ¦Ό
3.
reduce
κ° λ¨μΌ κ°μ λ°ν ν λ λ°°μ΄μ κΈ°λν©λλ€.
λ€ννλ μ²μ λ κ°λ νΌνκΈ° μ½μ΅λλ€. κ·νμ μ΄κΈ° κ°μΉκ° 무μμΈμ§ κ²°μ νλ κ²μ κ·νκ°νλ μΌμ λ¬λ € μμ§λ§, μ μνκ² κ²°μ ν κ²μ λλ€.
λ§μ§λ§ νλλ μ‘°κΈ μ΄μνκ² λ³΄μΌ μ μμ΅λλ€. reduce
λ§μ΄ νλμ κ°μ λ°ννλ€λ©΄ μ λ°°μ΄μ κΈ°λν μ μμ΅λκΉ?
κ±°κΈ°μλ λͺ κ°μ§ μ’μ μ΄μ κ° μμ΅λλ€. 첫째λ‘,reduce
λ νμ νλμ value λ₯Ό 리ν΄ν©λλ€. νμ νλμ number λ₯Ό 리ν΄νλ κ²μ μλλλ€. μλ₯Ό λ€μ΄, λ°°μ΄ λ°°μ΄μ μ€μ΄λ©΄ λ¨μΌ λ°°μ΄μ λ°νν©λλ€. λ²λ¦μ΄ μκ±°λ λ°°μ΄μ μ€μ΄λ κ²½μ° λ¨μΌ νλͺ©μ ν¬ν¨νλ λ°°μ΄μ νΉλ³ν κ²½μ°κ° μλ κ²μΌλ‘ μμνλ κ²μ΄ μ μ ν κ²μ
λλ€.
λμ§Έλ‘,reduce
did κ° λ¨μΌ κ°μ κ°λ λ°°μ΄μ λ°ννλ€λ©΄,map
κ³Όfilter
μ ν¨κ» μμ°μ€λ½κ² μ¬μ λ κ²μ
λλ€.
Implementation
νλ μλ μ°λ¦¬ λ§μ§λ§ λͺ¨μ΅μμν μκ°. νμμ κ°μ΄, Mozillaλ κ·Έκ²μ νμΈνκ³ μΆλ€λ©΄ bulletproof polyfill for reduceμ κ°μ§κ³ μμ΅λλ€.
var reduce = function (array, callback, initial) {
var accumulator = initial || 0;
array.forEach(function (element) {
accumulator = callback(accumulator, array[i]);
});
return accumulator;
};
μ£Όλͺ©ν λ κ°μ§ μ¬νμ λ€μκ³Ό κ°μ΅λλ€.
- μ΄λ²μλ
previous
λμaccumulator
λΌλ μ΄λ¦μ μ¬μ©νμ΅λλ€. μ΄κ²μ μΌμμμ μΌλ°μ μΌλ‘ λ³Ό μμλ κ²μ λλ€. - μ¬μ©μκ° κ°μ μ 곡νλ©΄ μ΄κΈ° κ°μ 'accumulator'λ‘ μ§μ νκ³ , κ·Έλ μ§ μμΌλ©΄ κΈ°λ³Έκ°μ '0'μΌλ‘ μ§μ ν©λλ€. μ΄κ²μ΄ μ€μ
reduce
κ° λμνλ λ°©μμ λλ€.
Putting It Together: Map, Filter, Reduce, and Chainability
μ΄ μμ μμ λΉμ μ κ°λͺ μλ°μ§ λͺ»ν μλ μμ΅λλ€.
map
,filter
,reduce
λ λ
μμ μΌλ‘ λ무 ν₯λ―Έ λ‘μ§ μμ΅λλ€.
κ²°κ΅, κ·Έλ€μ μ§μ ν νμ μ°μμ±μ μμ΅λλ€.
λ€μκ³Ό κ°μ΄νκ³ μΆλ€κ³ ν©μλ€.
- 2 μΌλΆμ μ 무λ₯Ό λͺ¨μΌμμμ€.
- μμ μ§μ μκ°μ λΆμ΄ μλ μκ°μΌλ‘ λ³ννμμμ€.
- 2 μκ° μ΄μ κ±Έλ¦° λͺ¨λ κ²μ κ±Έλ¬ λΈλ€.
- λ€ ν©μΉ κ².
- κ²°κ³Όμ κ²°μ μκ°λΉ μκΈμ κ³±νμμμ€.
- νμν λ κΈμ‘μ μΆλ ₯νμμμ€.
λ¨Όμ μμμΌκ³Ό νμμΌμ μμ μ μ μ ν΄ λ³΄κ² μ΅λλ€.
var monday = [
{
'name' : 'Write a tutorial',
'duration' : 180
},
{
'name' : 'Some web development',
'duration' : 120
}
];
var tuesday = [
{
'name' : 'Keep writing that tutorial',
'duration' : 240
},
{
'name' : 'Some more web development',
'duration' : 180
},
{
'name' : 'A whole lot of nothing',
'duration' : 240
}
];
var tasks = [monday, tuesday];
κ·Έλ¦¬κ³ μ΄μ , μ°λ¦¬μ μλ¦λ€μ΄ λͺ¨μ΅μ λ³ν :
var result = tasks.reduce(function (accumulator, current) {
return accumulator.concat(current);
}).map(function (task) {
return (task.duration / 60);
}).filter(function (duration) {
return duration >= 2;
}).map(function (duration) {
return duration * 25;
}).reduce(function (accumulator, current) {
return [(+accumulator) + (+current)];
}).map(function (dollar_amount) {
return '$' + dollar_amount.toFixed(2);
}).reduce(function (formatted_dollar_amount) {
return formatted_dollar_amount;
});
λλ λ κ°κ²°νκ² :
// Concatenate our 2D array into a single list
var result = tasks.reduce((acc, current) => acc.concat(current))
// Extract the task duration, and convert minutes to hours
.map((task) => task.duration / 60)
// Filter out any task that took less than two hours
.filter((duration) => duration >= 2)
// Multiply each tasks' duration by our hourly rate
.map((duration) => duration * 25)
// Combine the sums into a single dollar amount
.reduce((acc, current) => [(+acc) + (+current)])
// Convert to a "pretty-printed" dollar amount
.map((amount) => '$' + amount.toFixed(2))
// Pull out the only element of the array we got from map
.reduce((formatted_amount) =>formatted_amount);
λΉμ μ΄ κ·Έκ²μ λ©λ¦¬ λ§λ€μλ€λ©΄, μ΄κ²μ κ½€ κ°λ¨ν΄μΌν©λλ€. κ·Έλλ μ€λͺ ν μμλ μ΄μν μ μ΄ λ κ°μ§ μμ΅λλ€.
첫째, 10 νμ λ€μκ³Ό κ°μ΄ μ¨μΌν©λλ€.
// Remainder omitted
reduce(function (accumulator, current) {
return [(+accumulator) + (+current_];
})
μ¬κΈ°μμ μ€λͺ ν λ κ°μ§ μ¬νμ λ€μκ³Ό κ°μ΅λλ€.
1.accumulator
μcurrent
μμμλ λνκΈ° κΈ°νΈλ κ°μ μ«μμ κ°μν©λλ€. μ΄λ κ²νμ§ μμΌλ©΄ λ°ν κ°μ μΈλͺ¨μλ λ¬Έμμ΄ μΈ "12510075100 "
μ΄λ©λλ€.
2. κ·Έ ν©μ κ΄νΈλ‘ λ¬Άμ§ μμΌλ©΄ reduce
λ λ°°μ΄μ΄ μλλΌ λ¨μΌ κ°μ λ±μ΄λ
λλ€. λ°°μ΄μmap
λ§ μ¬μ©ν μ μκΈ° λλ¬Έμ κ²°κ΅ TypeError
λ₯Ό λμ§ κ²μ
λλ€!
μ½κ°μ λΆνΈ ν¨μ μ€ μμλ λ λ²μ§Έ λΉνΈλ λ§μ§λ§ reduce
μ
λλ€.
// Remainder omitted
map(function (dollar_amount) {
return '$' + dollar_amount.toFixed(2);
}).reduce(function (formatted_dollar_amount) {
return formatted_dollar_amount;
});
map
μ λν νΈμΆμ λ¨μΌ κ°μ ν¬ν¨νλ λ°°μ΄μ λ°νν©λλ€. μ¬κΈ°μ μ°λ¦¬λreduce
λ₯Ό νΈμΆνμ¬ κ·Έ κ°μ μ κ±°ν©λλ€.
μ΄λ₯Ό μννλ λ€λ₯Έ λ°©λ²μreduce 'νΈμΆμ μ κ±°νκ³
map`μ΄ κΊΌλ΄λ λ°°μ΄μ μΈλ±μ€νλ κ²μ
λλ€ :
var result = tasks.reduce(function (accumulator, current) {
return accumulator.concat(current);
}).map(function (task) {
return (task.duration / 60);
}).filter(function (duration) {
return duration >= 2;
}).map(function (duration) {
return duration * 25;
}).reduce(function (accumulator, current) {
return [(+accumulator) + (+current)];
}).map(function (dollar_amount) {
return '$' + dollar_amount.toFixed(2);
})[0];
κ·Έ λ§μ΄ λ§μ΅λλ€. λ°°μ΄ μμΈμ μ¬μ©νλ κ²μ΄ λ νΈν κ²½μ° λ°λ‘ μ΄λνμμμ€.
κ·Έλ¬λ λλ λΉμ μ΄νμ§ μκΈ°λ₯Ό κΆν©λλ€. μ΄λ¬ν ν¨μλ₯Ό μ¬μ©νλ κ°μ₯ κ°λ ₯ν λ°©λ² μ€ νλλ λ°°μ΄ νλ‘κ·Έλλ°μ μμ λ‘κ² μ¬μ©ν μμλ λ°μ ν νλ‘κ·Έλλ°μ μμμ μμ΅λλ€. κ·Έ μ΅κ΄μ λ²λ¦¬λ©΄ μ΄μ λ λ°μ κΈ°μ μ ν¨μ¬ μ½κ² λ°°μ°κ²λ©λλ€.
λ§μ§λ§μΌλ‘, μ°λ¦¬μ μΉκ΅¬ μΈ forEach
루νκ° μ΄λ»κ² μμ±λλμ§ λ΄
μλ€.
var concatenated = monday.concat(tuesday),
fees = [],
formatted_sum,
hourly_rate = 25,
total_fee = 0;
concatenated.forEach(function (task) {
var duration = task.duration / 60;
if (duration >= 2) {
fees.push(duration * hourly_rate);
}
});
fees.forEach(function (fee) {
total_fee += fee
});
var formatted_sum = '$' + total_fee.toFixed(2);
μ°Έμ μλ μμ§λ§ μλ λ½μ΅λλ€.
Conclusion & Next Steps
μ΄ νν 리μΌμμλmap
,filter
λ°reduce
μμ
μ λ°°μ μ΅λλ€. κ·Έλ€μ μ¬μ©νλ λ°©λ²; κ·Έλ¦¬κ³ λλ΅ μ΄λ»κ² ꡬνλκ³ μλμ§λ₯Ό 보μ¬μ€λλ€. μ¬λ¬λΆμfor
μforEach
루νλ₯Ό μ¬μ©νμ¬ μνλ₯Ό λ³κ²½νλ κ²μ νΌν μ μλ€λ κ²μ 보μμ΅λλ€. μ΄μ λ λͺ¨λ ν¨κ» μ°κ²°νλ λ°©λ²μ λν μ’μ μμ΄λμ΄λ₯Ό μ»μμ΄μΌν©λλ€.
μ§κΈκΉμ§, λλ λΉμ μ΄ μ°μ΅κ³Ό μΆκ° λ μμ μ΄λ§νκ³ μλ€κ³ νμ ν©λλ€. μ¬κΈ°μ λ€μμΌλ‘ ν₯ν μμΉμ λν μΈ κ°μ§ μ£Όμ μ μ μ¬νμ΄ μμ΅λλ€.
- JavaScriptμ Functional Programming in JavaScriptμ λν Jafar Husain 's μ νλ₯ν μ°μ΅ μΈνΈ. Rx. jsμ λν νμ€ν μκ°κ° μμ΅λλ€.
- Envato Tuts + κ°μ¬ Jason Rhodes'μ [JavaScriptμ κΈ°λ₯ νλ‘κ·Έλλ° κ°μ’](https://code.tutsplus.com/courses/functional-programming- in-javascript)
- μ°λ¦¬κ° μ λμ°λ³μ΄λ₯Ό νΌνλ μ΄μ μ λν΄ κΉμ΄μλ κΈ°λ₯ νλ‘κ·Έλλ°μ λν κ°μ₯ μ μ ν κ°μ΄λκ³Ό μΌλ°μ μΌλ‘ κΈ°λ₯μ μ¬κ³
JavaScriptλ μΉμμ μλνλ μ¬μ€μμ μΈμ΄ μ€ νλκ°λμμ΅λλ€. κ·Έκ²μ νμ΅ κ³‘μ μμ΄λ μλμμ,λΏλ§ μλλΌ λΉμ μ λ°μκ² μ μ§νλ νλ μ μν¬μ λΌμ΄λΈλ¬λ¦¬κ° λ§μ΄ μμ΅λλ€. 곡λΆνκ±°λ μ§μ₯μμ μ¬μ©ν μΆκ° 리μμ€λ₯Ό μ°Ύκ³ μλ€λ©΄ Envato λ§μΌ νλ μ΄μ€μμ μ 곡λλ κ²μ νμΈνμμμ€.
μ΄λ° μ’ λ₯μ μΌμ λ μνλ€λ©΄ μμλ‘ λ΄ νλ‘ν νμΈμ ν΄λ¦νμμμ€. νΈμν°μ λλ₯Ό λΆμ‘μ λΌ (@PelekeS); λλ http://peleke.me.μμ λ΄ λΈλ‘κ·Έλ₯Ό μ‘°ννμμμ€.
μ§λ¬Έ, μ견 λλ νΌλ? μλμ λ¨κ²¨λλ©΄ μ΅μ μ λ€ν΄ κ°λ³μ μΌλ‘ λμκ° κ²μ λλ€.
Learn JavaScript: The Complete Guide
μμνκΈ° λ§νλ©΄λ©λλ€ μλ° μ€ν¬λ¦½νΈ λ°°μ°κΈ°νλ λ° λμμ΄λλ μμ ν μλ΄μλ₯Ό μμ±νμ΅λλ€. μΉ κ°λ°μλ‘μ λλ λ κ³ κΈ μ£Όμ λ₯Ό νννκ³ μΆμ΅λλ€.