arr.reduce((accumulator, currentValue[, index, array])(, initialValue)
보통 일반적으로 reduce ((acc ,cur) => (acc + cur)) 이렇게 사용되는데, 식이 복잡해서 당황했지만, 쉽게 생각하면 for문을 간단하게 간략화한 것이다.
for (let i = 0; i < arr.length; i++) {
result += arr[i]
}
기존에 하나하나의 값을 넣고 넘어가고 더하고 이걸 반복했다면, 이걸 고급함수를 통해서 간략화 시킬 수 있었다.
accumulator에는 i가 i+1로 넘어갈때 처럼 값이 들어오고 , index는 i와 같이 순서를 우리이게 말해주고 있다. 일단 이렇게 이해하고 이 reduce함수가 어떻게 다양하게 다뤄지는지 보는게 더 중요하다.
1)배열을 딕셔너리로 변환
// 배열을 딕셔너리로 변환한다
let rr = ["lion", "tiger"].reduce(
( result, curr ) => {
result[curr] = curr;
return result;
},
{}
);
console.log(rr) // 결과값: {lion: "lion", tiger: "tiger"}
let countedNames = ['A', 'B', 'A', 'A', 'B'].reduce(function (result, cur) {
if (cur in result) {
result[cur]++
} else {
result[cur] = 1
}
return result
}, {})
console.log(countedNames) // {A: 3, B: 2}
이런식으로 return값 전에 조건문을 달수도 있다.
2)딕셔너리(키:값)에서 값이 비어있는 경우 필터링하기
const params = {"hobby":"", "address":"seoul"}
const filteredParams = Object.keys(params).reduce(function (filtered, key) {
if (params[key] !== "") filtered[key] = params[key];
return filtered;
}, {});
console.log('params:', params) // params: {hobby: "", address: "seoul"}
console.log('filteredParams:', filteredParams) // filteredParams: {address: "seoul"}