手写数组方法:reduce及其常用用途

597 阅读1分钟

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)
})