reduce定义:
reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。
reduce() 可以作为一个高阶函数,用于函数的 compose。
注意: reduce() 对于空数组是不会执行回调函数的。
array.reduce(function(cb, pre, i, init)
- arr 表示元素所属的原数组;
- pre 表示上一次调用回调函数时产生的返回值,或初始值init;
- cur 表示当前正在处理的数组元素
- index 表示正在处理元素的索引,若提供init值,则索引为0,否则索引为1
手写reduce
Array.prototype.reduce = function(cb, pre, i, init) {
if (typeof cb !== 'function') throw new TypeError('This argments should be a function.')
let arr = this
// 是不是空数组?
if (arr.length === 0) {
return []
}
// 如果调用 reduce()时提供了 init, pre 取值为 init,
// cur 取数组中的第一个值;
// 如果没有提供 init,那么 pre 取数组中的第一个值
// cur 取数组中的第二个值
pre = init == undefined ? arr[0] : init
// 正在处理元素的索引,若提供init值,则索引为0,否则索引为1
i = init === undefined ? 1 : 0
// 遍历数组
for (i; i < arr.length; i++) {
pre = cb(pre, arr[i], i)
}
return pre
}
var arr = [1, 2, 3]
console.log(arr.reduce((prev, item) => prev + item))
1.去重
var arr = [1,1,4,4,1,2,3,4]
arr.reduce((pre, item) => {
!pre.includes(item) && prev.push(item)
return pre
}, [])
2.数组扁平化
var arr = [[1,2], 3, [4,5]]
arr.reduce((pre, item) => {
if (Array.isArray(item)) {
pre = pre.concat(item)
} else {
pre.push(item)
}
return pre
}, [])
3.统计重复次数
var arr = ['a','c','c','a','e','a']
arr.reduce((pre, item) => {
pre[item]++ || (pre[item] = 1)
return pre
}, {})
4. 求最大/最小值
var arr = [1,2,3,4]
arr.reduce((pre, item) => {
return Math.max(pre, item)
// 最小值
// return Math.min(pre, item)
})