一、reduce方法接收2個參數
參數1:function(accumulator, currentValue, index, arr) {},必須
accumulator:必須,初始值(initialValue)或計算後的傳回值(上次調用函數的傳回值)
currentValue:必須,目前元素
index:可選,目前元素的索引
arr:可選,目前元素所屬的數組
參數2:initialValue,可選,傳遞給函數的初始值
二、使用場景
1、數組求和
const arr = [1, 2, 3]
const total = arr.reduce((acc, cur) => acc + cur)
const total1 = arr.reduce((acc, cur) => acc + cur, 10)
console.log(total) // 6
console.log(total1) // 16
一般來說,傳了初始值會更安全
const arr = []
const total = arr.reduce((acc, cur) => acc + cur, 0) // 不傳初始值會報錯:Reduce of empty array with no initial value
console.log(total) // 0
數組對象中的屬性求和
const arr = [{ x: 1 }, { x: 2 }, { x: 3 }]
const total = arr.reduce((acc, cur) => acc + cur.x, 0)
console.log(total) // 6
initialValue為0,必傳。這裡可以先通過map拿到所有的x,再求和,但是這樣就多循環了幾次
2、二維數組轉一維數組
const arr = [[1, 2], [3, 4], [5, 6]]
const newArr = arr.reduce((acc, cur) => acc.concat(cur), [])
console.log(newArr) // [1, 2, 3, 4, 5, 6]
多元數組轉扁平化
const arr = [
[1, 2],
[3, 4],
[5, [6, 7, [8]]]
]
const flatten = arr => arr.reduce((acc, cur) => acc.concat(Array.isArray(cur) ? flatten(cur) : cur),[])
const newArr = flatten(arr)
console.log(newArr) // [1, 2, 3, 4, 5, 6, 7, 8]
3、計算數組中每個元素出現的次數
const arr = ['one', 'two', 'three', 'two', 'three', 'three']
const count = arr.reduce((acc, cur) => {
if (cur in acc) {
acc[cur]++
} else {
acc[cur] = 1
}
return acc
}, {})
console.log(count) // {one: 1, two: 2, three: 3}
4、去重
const arr = [1, 2, 3, 4, 3, 2, 1]
const newArr = arr.reduce((acc, cur) => {
!acc.includes(cur) && acc.push(cur)
return acc
}, [])
console.log(newArr) // [1, 2, 3, 4]
5、按屬性對object進行分類
const people = [
{ name: 'Alice', age: 21 },
{ name: 'Max', age: 20 },
{ name: 'Jane', age: 20 }
]
function groupBy(arr, property) {
return arr.reduce((acc, cur) => {
const key = cur[property]
!acc[key] && (acc[key] = [])
acc[key].push(cur)
return acc
}, {})
}
const res = groupBy(people, 'age')
console.log(res) // {20: Array(2), 21: Array(1)}