Array.prototype.reduce() 함수는 콜백함수 혹은 콜백함수와 초기값을 전달하여 원하는 값을 누적시킨 뒤 return 한다. 즉, 리턴된 값은 누적된 값의 결과와 동일하다.
이때 콜백함수는 배열요소의 개수만큼 호출하고 호출할 때 이전 콜백함수의 누적된 값을 인자로 전달한다.
reduce(callback)
reduce(callback[, initialValue])
callback함수는 배열의 각 요소에 대해 실행되며 4가지 값을 파라미터로 받는다.
["Learn", "reduce", "function"].reduce((acc, cur) => acc+ ' '+ cur, 'Listen!!!' )
// expected : Listen!!! Learn reduce function
initialValue : 'Listen!!!' 은 첫번째 콜백함수의 누적값이고,
첫번재 콜백함수의 반환값은 'Listen!!! Learn 이다.
["Learn", "reduce", "function"].reduce((acc, cur) => acc+ ' '+ cur, 'Listen!!!' )
// expected : Learn reduce function
initialValue가 없기 때문에 첫번째 콜백함수의 누적값은 첫번째 엘리먼트인 'Learn'.
반환값은 'Learn reduce 이다.
[0, 1, 2, 3, 4].reduce((accumulator, currentValue, currentIndex, array) => {
return accumulator + currentValue;
}, 10);
[0, 1, 2, 3, 4].reduce((accumulator, currentValue, currentIndex, array) => {
return accumulator + currentValue;
});
객체로 구성된 배열에서 값을 합산할 때, 빈 배열에서 reduce()를 사용할 때에는 꼭!!!! 초기값을 설정해야 한다.
콜백함수의 호출 횟수는 reduce() 함수를 호출하는 배열의 길이만큼 실행되지만
경우에 따라 모든 요소를 순회하지 않아도 되는 경우가 있다.
코드를 살펴보자.
[0,1,2,3,4].reduce((acc, cur, idx, arr) => {
if(cur ===3) {
arr.splice(idx)
}else {
return acc + cur
}
},0)
arr.splice(idx)