reduce()
reduce()
메서드는 배열의 각 요소에 대해 주어진 리듀서(reducer) 함수를 실행하고, 하나의 결과값을 반환한다.
const array1 = [1, 2, 3, 4];
// 0 + 1 + 2 + 3 + 4
const initialValue = 0;
const sumWithInitial = array1.reduce(
(previousValue, currentValue) => previousValue + currentValue,
initialValue
);
console.log(sumWithInitial);
// expected output: 10
리듀서 함수는 네 개의 인자를 가진다.
리듀서 함수의 반환 값은 누산기에 할당되고, 누산기는 순회 중 유지되므로
결국 최종 결과는 하나의 값이 된다.
arr.reduce(callback[, initialValue])
callback
배열의 각 요소에 대해 실행할 함수로 아래의 네 가지 인수를 받는다.
accumulator
누산기는 콜백의 반환값을 누적한다. 콜백의 이전 반환값 또는, 콜백의 첫 번째 호출이면서
initialValue
를 제공한 경우에는 initialValue
의 값이다.
currentValue
처리할 현재 요소
currentIndex
처리할 현재 요소의 인덱스. initialValue
를 제공한 경우 0, 아니면 1부터 시작한다.
array
reduce()
를 호출한 배열
initialValue
callback
의 최초 호출에서 첫 번째 인수에 제공하는 값.
초기값을 제공하지 않으면 배열의 첫 번째 요소를 사용한다.
빈 배열에서 초기값 없이 reduce()
를 호출하면 오류가 발생한다.
누적 계산의 결과 값
reduce()
는 빈 요소를 제외하고 배열 내에 존재하는 각 요소에 대해 callback
함수를
한 번씩 실행하는데, 콜백 함수는 아래의 네 개의 인수를 받는다.
accumulator
currentValue
currentIndex
array
배열이 비어있는데 initialValue
도 제공하지 않으면 TypeError
가 발생한다. 배열의 요소가 (위치와 관계없이) 하나 뿐이면서 initialValue
를 제공하지 않은 경우, 또는 initialValue
는 주어졌으나 배열이 빈 경우엔 그 단독 값을 callback
호출 없이 반환합니다.
아래 예제처럼 initialValue
을 제공하지 않으면 출력 가능한 형식이 세 가지이므로,
보통 초기값을 주는 것이 더 안전하다.
var maxCallback = ( acc, cur ) => Math.max( acc.x, cur.x );
var maxCallback2 = ( max, cur ) => Math.max( max, cur );
// initialValue 없이 reduce()
[ { x: 22 }, { x: 42 } ].reduce( maxCallback ); // 42
[ { x: 22 } ].reduce( maxCallback ); // { x: 22 }
[ ].reduce( maxCallback ); // TypeError
// map/reduce로 개선 - 비었거나 더 큰 배열에서도 동작함
[ { x: 22 }, { x: 42 } ].map( el => el.x )
.reduce( maxCallback2, -Infinity );
배열의 모든 값 합산
var sum = [0, 1, 2, 3].reduce(function (accumulator, currentValue) {
return accumulator + currentValue;
}, 0);
// sum is 6
객체 배열에서의 값 합산
var initialValue = 0;
var sum = [{x: 1}, {x:2}, {x:3}].reduce(function (accumulator, currentValue) {
return accumulator + currentValue.x;
},initialValue)
console.log(sum) // logs 6
중첩 배열 펼치기
var flattened = [[0, 1], [2, 3], [4, 5]].reduce(
function(accumulator, currentValue) {
return accumulator.concat(currentValue);
},
[]
);
// 펼친 결과: [0, 1, 2, 3, 4, 5]![](https://velog.velcdn.com/images/sehee-xx/post/eea67a31-14bd-4de6-a6fb-7c189096bc39/image.png)