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은 μ½œλ°±μ— μ„Έ 가지 인수λ₯Ό μ „λ‹¬ν•©λ‹ˆλ‹€.

  1. λ°°μ—΄μ˜ current item
  2. ν˜„μž¬ ν•­λͺ©μ˜ array 인덱슀
  3. 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λŠ” 콜백 인자 μ„Έ 개λ₯Ό λ„˜κΉλ‹ˆλ‹€ :

  1. current item
  2. current 색인
  3. 당신이`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λŠ” λ„€ μ½œλ°±μ„ μ „λ‹¬ν•©λ‹ˆλ‹€ :

  1. _current κ°’ _
  2. 이전 κ°’ _
  3. _ ν˜„μž¬ 색인 _
  4. 당신이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κ°€μžˆλŠ” μ„Έ 가지 큰 μž‘ν™”λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  1. 'λŒμ•„ κ°€κΈ°'λ₯Ό μžŠμ–΄ 버림
  2. 초기 κ°’ μžŠμ–΄ 버림 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;
};

μ£Όλͺ©ν•  두 가지 사항은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  1. μ΄λ²ˆμ—λŠ”previous λŒ€μ‹ accumulatorλΌλŠ” 이름을 μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€. 이것은 μ•Όμƒμ—μ„œ 일반적으둜 λ³Ό μˆ˜μžˆλŠ” κ²ƒμž…λ‹ˆλ‹€.
  2. μ‚¬μš©μžκ°€ 값을 μ œκ³΅ν•˜λ©΄ 초기 값을 'accumulator'둜 μ§€μ •ν•˜κ³ , 그렇지 μ•ŠμœΌλ©΄ 기본값을 '0'으둜 μ§€μ •ν•©λ‹ˆλ‹€. 이것이 μ‹€μ œreduceκ°€ λ™μž‘ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€.

Putting It Together: Map, Filter, Reduce, and Chainability

이 μ‹œμ μ—μ„œ 당신은 감λͺ…을받지 λͺ»ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

map,filter,reduceλŠ” λ…μžμ μœΌλ‘œ λ„ˆλ¬΄ ν₯λ―Έ 둭지 μ•ŠμŠ΅λ‹ˆλ‹€.

κ²°κ΅­, κ·Έλ“€μ˜ μ§„μ •ν•œ νž˜μ€ 연쇄성에 μžˆμŠ΅λ‹ˆλ‹€.

λ‹€μŒκ³Ό κ°™μ΄ν•˜κ³  μ‹Άλ‹€κ³ ν•©μ‹œλ‹€.

  1. 2 μΌλΆ„μ˜ 업무λ₯Ό λͺ¨μœΌμ‹­μ‹œμ˜€.
  2. μž‘μ—… 지속 μ‹œκ°„μ„ 뢄이 μ•„λ‹Œ μ‹œκ°„μœΌλ‘œ λ³€ν™˜ν•˜μ‹­μ‹œμ˜€.
  3. 2 μ‹œκ°„ 이상 κ±Έλ¦° λͺ¨λ“  것을 걸러 λ‚Έλ‹€.
  4. λ‹€ ν•©μΉœ 것.
  5. 결과에 결제 μ‹œκ°„λ‹Ή μš”κΈˆμ„ κ³±ν•˜μ‹­μ‹œμ˜€.
  6. ν˜•μ‹ν™” 된 κΈˆμ•‘μ„ 좜λ ₯ν•˜μ‹­μ‹œμ˜€.

λ¨Όμ € μ›”μš”μΌκ³Ό ν™”μš”μΌμ— μž‘μ—…μ„ μ •μ˜ ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.

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 루프λ₯Ό μ‚¬μš©ν•˜μ—¬ μƒνƒœλ₯Ό λ³€κ²½ν•˜λŠ” 것을 ν”Όν•  수 μžˆλ‹€λŠ” 것을 λ³΄μ•˜μŠ΅λ‹ˆλ‹€. μ΄μ œλŠ” λͺ¨λ‘ ν•¨κ»˜ μ—°κ²°ν•˜λŠ” 방법에 λŒ€ν•œ 쒋은 아이디어λ₯Ό μ–»μ—ˆμ–΄μ•Όν•©λ‹ˆλ‹€.

μ§€κΈˆκΉŒμ§€, λ‚˜λŠ” 당신이 μ—°μŠ΅κ³Ό μΆ”κ°€ λ…μ„œμ— μ—΄λ§ν•˜κ³  μžˆλ‹€κ³  ν™•μ‹ ν•©λ‹ˆλ‹€. 여기에 λ‹€μŒμœΌλ‘œ ν–₯ν•  μœ„μΉ˜μ— λŒ€ν•œ μ„Έ 가지 μ£Όμš” μ œμ•ˆ 사항이 μžˆμŠ΅λ‹ˆλ‹€.

  1. JavaScript의 Functional Programming in JavaScript에 λŒ€ν•œ Jafar Husain 's 의 ν›Œλ₯­ν•œ μ—°μŠ΅ μ„ΈνŠΈ. Rx. js에 λŒ€ν•œ ν™•μ‹€ν•œ μ†Œκ°œκ°€ μžˆμŠ΅λ‹ˆλ‹€.
  2. Envato Tuts + 강사 Jason Rhodes'의 [JavaScript의 κΈ°λŠ₯ ν”„λ‘œκ·Έλž˜λ° κ°•μ’Œ](https://code.tutsplus.com/courses/functional-programming- in-javascript)
  3. μš°λ¦¬κ°€ μ™œ λŒμ—°λ³€μ΄λ₯Ό ν”Όν•˜λŠ” μ΄μœ μ— λŒ€ν•΄ κΉŠμ΄μžˆλŠ” κΈ°λŠ₯ ν”„λ‘œκ·Έλž˜λ°μ— λŒ€ν•œ κ°€μž₯ μ μ ˆν•œ κ°€μ΄λ“œκ³Ό 일반적으둜 κΈ°λŠ₯적 사고

JavaScriptλŠ” μ›Ήμ—μ„œ μž‘λ™ν•˜λŠ” μ‚¬μ‹€μƒμ˜ μ–Έμ–΄ 쀑 ν•˜λ‚˜κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 그것은 ν•™μŠ΅ 곑선 μ—†μ΄λŠ” μ•„λ‹ˆμ—μš”,뿐만 μ•„λ‹ˆλΌ 당신을 λ°”μ˜κ²Œ μœ μ§€ν•˜λŠ” ν”„λ ˆμž„ μ›Œν¬μ™€ λΌμ΄λΈŒλŸ¬λ¦¬κ°€ 많이 μžˆμŠ΅λ‹ˆλ‹€. κ³΅λΆ€ν•˜κ±°λ‚˜ 직μž₯μ—μ„œ μ‚¬μš©ν•  μΆ”κ°€ λ¦¬μ†ŒμŠ€λ₯Ό μ°Ύκ³  μžˆλ‹€λ©΄ Envato λ§ˆμΌ“ ν”Œλ ˆμ΄μŠ€μ—μ„œ μ œκ³΅λ˜λŠ” 것을 ν™•μΈν•˜μ‹­μ‹œμ˜€.

이런 μ’…λ₯˜μ˜ 일을 더 μ›ν•œλ‹€λ©΄ μˆ˜μ‹œλ‘œ λ‚΄ ν”„λ‘œν•„ 확인을 ν΄λ¦­ν•˜μ‹­μ‹œμ˜€. νŠΈμœ„ν„°μ— λ‚˜λ₯Ό λΆ™μž‘μ•„ 라 (@PelekeS); λ˜λŠ” http://peleke.me.μ—μ„œ λ‚΄ λΈ”λ‘œκ·Έλ₯Ό μ‘°νšŒν•˜μ‹­μ‹œμ˜€.

질문, 의견 λ˜λŠ” ν˜Όλž€? μ•„λž˜μ— 남겨두면 μ΅œμ„ μ„ λ‹€ν•΄ κ°œλ³„μ μœΌλ‘œ λŒμ•„κ°ˆ κ²ƒμž…λ‹ˆλ‹€.

Learn JavaScript: The Complete Guide

μ‹œμž‘ν•˜κΈ° λ§Œν•˜λ©΄λ©λ‹ˆλ‹€ μžλ°” 슀크립트 λ°°μš°κΈ°ν•˜λŠ” 데 λ„μ›€μ΄λ˜λŠ” μ™„μ „ν•œ μ•ˆλ‚΄μ„œλ₯Ό μž‘μ„±ν–ˆμŠ΅λ‹ˆλ‹€. μ›Ή κ°œλ°œμžλ‘œμ„œ λ˜λŠ” 더 κ³ κΈ‰ 주제λ₯Ό νƒν—˜ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.