数组reduce的用法
如何使用reduce
arr.reduce(callback(accumulator, currentValue, index, array), initialValue)
- reduce函数中一共接收两个参数:
- callback:执行数组中的每个值(如果没有提供initialValue,第一个值除外)的函数,该函数中包含四个参数:
- accumulator:上一次循环返回的值或者initialValue
- currentValue: 当前循环的值
- index:当前处理数据的索引
- array:调用reduce的数组本身
- initialValue:第一次调用callback函数时,accumulator的值,如果没有传入该参数,reduce会使用数组中的第一个元素的值作为初始值,所以空数组调用reduce会出现报错
- callback:执行数组中的每个值(如果没有提供initialValue,第一个值除外)的函数,该函数中包含四个参数:
实例解析
- 基础用法
// let arr = [] // 报错:Reduce of empty array with no initial value
let arr = [1, 2, 3, 4]
arr.reduce((prev, curv, i, arr) => {
console.log('上一次返回值:' + prev) // 打印结果:2 3 4
console.log('当前循环值:' + curv) // 打印结果:2 3 4
console.log('当前循环下标:' + i) // 打印结果:0 1 2
console.log('调用循环的数组' + prev) // 打印结果:[1, 2, 3, 4]
return curv
})
在上述例子中会发现:一共四个元素,缺少了一次循环?主要是因为没有传initialValue参数,只需要增加初始值,循环依旧是四次
- 求和
let arr = [1, 2, 3, 4]
let sun = arr.reduce((prev, curv, i, arr) => {
return prev + curv
})
console.log(sun) // 10
- 数组去重
let arr = [1, 2, 3, 4, 3, 4]
let newArr = arr.reduce((prev, curv, i, arr) => {
if (!prev.includes(curv)) {
prev.push(curv)
}
return prev
}, [])
console.log(newArr ) // [1, 2, 3, 4]
- 扁平二维数组
let arr = [[1, 2], [3, 4], [5, 6]]
let newArr = arr.reduce((prev, curv) => {
return prev.concat(curv)
}, [])
console.log(newArr) // [1, 2, 3, 4, 5, 6]
个人记录