reduce()
메서드는 누산기(accumulator) 및 배열의 각 값(좌에서 우로)에 대해 (누산된) 한 값으로 줄도록 함수를 적용합니다.
구문
arr.reduce(callback[, initialValue])
매개변수
callback
- 배열의 각 (요소) 값에 실행할 함수, 인수(argument) 4개를 취하는:
previousValue
- 이전 마지막 콜백 호출에서 반환된 값 또는 공급된 경우
initialValue
. (아래 참조.) currentValue
- 배열 내 현재 처리되고 있는 요소(element).
currentIndex
- 배열 내 현재 처리되고 있는 요소의 인덱스.
array
reduce
에 호출되는 배열.
initialValue
- 선택사항.
callback
의 첫 호출에 첫 번째 인수로 사용하는 값.
설명
reduce
는 배열에 있는 구멍(빈 값)은 제외한 각 요소에 대해 callback
함수를 한 번 실행합니다, 다음 네 인수를 취하는:
previousValue
currentValue
currentIndex
array
콜백이 호출된 첫 번째는, previousValue
및 currentValue
두 값 중 하나일 수 있습니다. reduce
호출에 initialValue
가 제공된 경우, 그러면 previousValue
는 initialValue
와 같고 currentValue
는 배열의 첫 번째 값과 같을 겁니다. initialValue
가 제공되지 않은 경우, 그러면 previousValue
는 배열의 첫 번째 값과 같고 currentValue
는 두 번째와 같을 겁니다.
빈 배열에 initialValue
가 제공되지 않은 경우, TypeError
가 발생됩니다. 배열이 요소가 하나(위치와 관계없이)뿐이고 initialValue
가 제공되지 않은 경우 또는 initialValue
는 제공됐으나 배열이 빈 경우, 그 단독 값이 callback
호출 없이 반환됩니다.
다음과 같은 reduce
사용이 일어났다고 생각해 보세요:
[0, 1, 2, 3, 4].reduce(function(previousValue, currentValue, currentIndex, array) { return previousValue + currentValue; });
콜백은 4번 호출됩니다, 다음과 같이 되는 각 호출의 인수 및 반환값과 함께:
previousValue |
currentValue |
currentIndex |
array |
반환값 | |
---|---|---|---|---|---|
1번째 호출 | 0 |
1 |
1 |
[0, 1, 2, 3, 4] |
1 |
2번째 호출 | 1 |
2 |
2 |
[0, 1, 2, 3, 4] |
3 |
3번째 호출 | 3 |
3 |
3 |
[0, 1, 2, 3, 4] |
6 |
4번째 호출 | 6 |
4 |
4 |
[0, 1, 2, 3, 4] |
10 |
reduce
에 의해 반환되는 값은 마지막 콜백 호출의 반환값 (10
)이 됩니다.
완전한 함수 대신에 화살표 함수를 제공할 수도 있습니다. 아래 코드는 위 블록 내 코드와 같은 출력을 냅니다:
[0, 1, 2, 3, 4].reduce( (prev, curr) => prev + curr );
reduce
의 두 번째 인수로 초기값을 제공하는 경우, 결과는 다음과 같을 겁니다:
[0, 1, 2, 3, 4].reduce(function(previousValue, currentValue, currentIndex, array) { return previousValue + currentValue; }, 10);
previousValue |
currentValue |
currentIndex |
array |
반환값 | |
---|---|---|---|---|---|
1번째 호출 | 10 |
0 |
0 |
[0, 1, 2, 3, 4] |
10 |
2번째 호출 | 10 |
1 |
1 |
[0, 1, 2, 3, 4] |
11 |
3번째 호출 | 11 |
2 |
2 |
[0, 1, 2, 3, 4] |
13 |
4번째 호출 | 13 |
3 |
3 |
[0, 1, 2, 3, 4] |
16 |
5번째 호출 | 16 |
4 |
4 |
[0, 1, 2, 3, 4] |
20 |
최종 호출 반환값(20
)은 reduce 함수의 결과로서 반환됩니다.
예
배열의 값 모두 더하기
var total = [0, 1, 2, 3].reduce(function(a, b) { return a + b; }); // total == 6
배열의 배열(2차원 배열) 1차원으로 내리기
var flattened = [[0, 1], [2, 3], [4, 5]].reduce(function(a, b) { return a.concat(b); }, []); // flattened is [0, 1, 2, 3, 4, 5]
폴리필
Array.prototype.reduce
는 ECMA-262 표준 제5판에 추가되었습니다; 그러하기에 표준의 모든 구현에 없을 수 있습니다. 스크립트 시작 부분에 다음 코드를 삽입하여 이를 우회할 수 있습니다, 원래 지원하지 않는 구현에서 reduce
를 사용케 하는.
// ECMA-262 5판, 15.4.4.21항의 작성 과정 // 참고: https://es5.github.io/#x15.4.4.21 if (!Array.prototype.reduce) { Array.prototype.reduce = function(callback /*, initialValue*/) { 'use strict'; if (this == null) { throw new TypeError('Array.prototype.reduce called on null or undefined'); } if (typeof callback !== 'function') { throw new TypeError(callback + ' is not a function'); } var t = Object(this), len = t.length >>> 0, k = 0, value; if (arguments.length == 2) { value = arguments[1]; } else { while (k < len && !(k in t)) { k++; } if (k >= len) { throw new TypeError('Reduce of empty array with no initial value'); } value = t[k++]; } for (; k < len; k++) { if (k in t) { value = callback(value, t[k], k, t); } } return value; }; }
스펙
브라우저 호환성
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | (Yes) | 3.0 (1.9) | 9 | 10.5 | 4.0 |
Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Basic support | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) |