이번 글에서는 Javascript array method 에피소드의 마지막, reduce 에 대해 적어보려고 합니다. 앞선 글들에서 이미 forEach, map, 그리고 filter, reject, every, some 를 다루었지만, reduce 는 자바스크립트 배열 메서드 중 활용도가 으뜸입니다.
먼저 예시코드부터 볼까요?
var votes = ["kim", "hong", "lee", "hong", "lee", "lee", "hong"];
var reducer = function(accumulator, value, index, array) {
if (accumulator.hasOwnProperty(value)) {
accumulator[val] = accumulator[val] + 1;
} else {
accumulator[val] = 1;
}
return accumulator;
}
var initialValue = {};
var result = votes.reduce(reducer, initialValue);
console.log(result); // { kim: 1, hong: 3, lee: 3 }
상기 코드는 votes 배열에 있는 값들을 순회하면서 최종적으로 각각의 값들이 몇 번 나오는지 count 하는 로직입니다. reduce 메서드의 첫 번째 인자로는 reducer 라는 함수를, 두 번째 인자로는 초기값, intialValue 라는 빈 object 를 전달합니다.
배열의 첫 번째 순회 때는 accumulator 의 값은 initialValue, 즉 {} 입니다. if 조건검사의 결과는 false 이므로 accumulator.kim = 1 이 되고, { “kim” : 1 } 이라는 값을 return 합니다.
두 번째 순회 때는 accumulator 의 값은 앞에서 전달받은 { “kim” : 1 } 이고, value 는 배열의 두 번째 값(votes[1])인 “hong” 이므로 return 하는 값은 { “kim” : 1, “hong” : 1 } 입니다. 이렇게 계속해서 배열의 끝까지 순회하면 최종적인 결과는 { kim: 1, hong: 3, lee: 3} 와 같습니다.