reduce메서드는 자신을 호출한 배열의 모든 요소를 순회하며 인수로 전달받은 콜백 함수를 반복 호출한다. 그리고 콜백 함수의 반환값을 다음 순회 시에 콜백 함수의 첫 번째 인수로 전달하면서 콜백 함수를 호출하여 하나의 결과값을 반환한다. 원본 배열은 변경되지 않는다. 사용문법은 다음과 같다.
arr.reduce(callback, [initalValue])
초기값
const arr = [1, 2, 3, 4];
const sum = arr.reduce((acc, cur, idx, arr) => acc + cur, 0);
// 10
1) 초기값으로 설정해준 0이 acc가 된다.
2) 배열의 첫 번째 요소인 1이 cur이 된다.
3) acc(0)와 cur(1)이 더해져서 acc가 1가 된다.
4) 배열의 두 번째 요소인 2가 cur이 된다.
5) acc(1)과 cur(2)이 더해져서 3이 acc가 된다.
6) 배열의 세 번째 요소인 3이 cur이 된다.
7) acc(3)과 cur(3)이 더해진 6이 acc가 된다.
8) 배열의 마지막 요소인 4와 acc(6)이 더해져 결과값은 10이 된다.
reduce메서드는 초기값과 배열의 첫 번재 요소값을 콜백 함수의 인수로 전달하며 호출하고 다음 순회에는 콜백 함수의 반환값과 두 번째 요소값을 콜백 함수의 인수로 전달하면서 호출한다. 이런 과정을 반복하여 reduce메서드는 하나의 결과값을 반환한다.
reduce메서드는 자신을 호출한 배열의 모든 요소를 순회하며 하나의 결과값을 구해야 하는 경우에 사용한다.
const arr = [1, 3, 6, 7, 4, 9];
const result = arr.reduce((acc, cur, idx, arr) => {
if (idx === arr.length - 1) {
return (acc + cur) / arr.length;
} return acc + cur;
},0);
// 5
마지막 순회가 아니면 누적값을 반환하고 마지막 순회면 평균을 구해 반환한다.
const arr = [1, 2, 1, 1, 2, 3, 4];
const result = arr.reduce((acc, cur, idx, arr) => {
if (arr.indexOf(cur) === idx) {
acc.push(cur);
}
return acc;
}, []);
// [1, 2, 3, 4]
순회 중인 요소의 인덱스가 자신의 인덱스라면 처음 순회하는 요소다.
이 요소만 초기값으로 전달받은 배열에 담아 반환한다.
순회 중인 요소의 인덱스가 자신의 인덱스가 아니라면 중복된 요소다.
참고 자료: MDN
모던 자바스크립트 Deep Dive