概要
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实现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求对象数组某属性的平均值
// 如下,求age平均值。使用reduce
arr = [
{name: 'hh', age: 10},
{name: 'hh', age: 13},
{name: 'hh', age: 6},
{name: 'hh', age: 14},
{name: 'hh', age: 12}
]
网友评论