- Published on
Javascript Reduce
- Author

- Name
- yceffort
멍청이라 그런지 reduce 함수가 잘 이해 되지 않았다.
Reduce
const list = [1, 2, 3, 4, 5]
const initValue = 10
const totalSum = list.reduce(
(accumulator, currentValue, currentIndex, array) => {
return accumulator + currentValue
},
initValue,
)
25
currentValue: 처리할 현재 요소currentIndex(optional): 처리할 요소의 인덱스accumulator: 콜백의 반환값을 계속해서 누적한다. 이 예제에서는 처음엔1, 그 다음엔1 + currentValue, 그 다음엔(1 + currentValue) + currentValue가 될 것이다.array(optional):reduce를 호출한 배열, 여기서는list = [1, 2, 3, 4, 5]이 될 것이다.initValue(optional):reduce의 최초 값. 없으면 배열의 0번째 값이 된다. 이 예제에서는initValue값이 10 이라서, 최종결과는10 + (1 + 2 ... + 5)이 될 것이다.
| call | accumulator | currentValue | currentIndex | array | return |
|---|---|---|---|---|---|
| 1st | 10 | 1 | 0 | [1,2,3,4,5] | 11 |
| 2nd | 11 | 2 | 1 | [1,2,3,4,5] | 13 |
| 3rd | 13 | 3 | 2 | [1,2,3,4,5] | 16 |
| 4th | 16 | 4 | 3 | [1,2,3,4,5] | 20 |
| 5th | 20 | 5 | 4 | [1,2,3,4,5] | 25 |
중첩 배열 펼치기
const complicatedList = [[0, 1], [2, 3], [4], [5, 6]]
complicatedList.reduce(
(accumulator, currentValue) => accumulator.concat(currentValue),
[],
)
[0, 1, 2, 3, 4, 5, 6]
이보다 더 괴랄한 array의 경우에도 재귀를 사용하여 가능하다.
const moreComplicatedList = [[0, 1], [[[2, 3]]], [[4, 5]], 6]
const flatten = function (arr, result = []) {
for (let i = 0, length = arr.length; i < length; i++) {
const value = arr[i]
if (Array.isArray(value)) {
flatten(value, result)
} else {
result.push(value)
}
}
return result
}
flatten(moreComplicatedList)
[0, 1, 2, 3, 4, 5, 6]