数组reduce方法

概要

Array.prototype.reduce方法接受两个参数。第一个是回调函数,该函数接受四个参数

function(
   accumulator,  // 上次操作返回的结果
   currentValue, // 当前数组元素
   currentIndex, // 当前数组索引
   array  // 被操作的数组
 ) {}

第二个是初始值 arr.reduce(function(acc, current, currntIndex, array) {....}, initial)

执行过程:reduce中的回调函数第一次执行时,将initial传给acc将数组第一个元素传给current. 如果函数体内有return则return的值就传给下次函数执行时的acc, 数组第二个元素就传给current,以此类推。

该函数返回累计处理的结果

数组reduce方法_第1张图片
reduce结果, 本例return最后的idx

用reduce实现map方法

map方法特性

map 方法会给原数组中的每个元素都按顺序调用一次 callback 函数。callback 每次执行后的返回值(包括 undefined)组合起来形成一个新数组

map使用

var new_array = arr.map(function callback(item[, idx[, array]]) {
// 返回新数组的元素
}[, thisArg执行 callback 函数时使用的this 值])

使用reduce实现map方法的代码

需要使用到的知识点有闭包,函数call方法, concat方法

function myMap (fn, thisArg) {
    return (list) => {
        if (typeof fn !== 'function') {
            // 做错误处理,抛出
        }
        if (Array.isArray(list)) {
            // 参数非数组,报错抛出
        }
        return list.reduce((a, itm, idx, arr) => {
            return a.concat(fn.call(thisArg, itm, idx, arr))
        }, [])
    }
}
数组reduce方法_第2张图片
实现效果

一个问题

用reduce求对象数组某属性的平均值

// 如下,求age平均值。使用reduce
arr = [
    {name: 'hh', age: 10},
    {name: 'hh', age: 13},
    {name: 'hh', age: 6},
    {name: 'hh', age: 14},
    {name: 'hh', age: 12}
]
参考

reduce方法
map方法

你可能感兴趣的:(数组reduce方法)