js中reduce的实现
reduce回顾
array.reduce(function(total, currentValue, currentIndex, arr), initialValue)
reduce接收两个参数:
- 第一个参数为一个回调函数
- 第二个参数表示初始值
- 回调函数中接收四个参数(pre,cur,index,arr) 分别是
- pre:上一次调用之后的结果
- cur: 当前要累加的元素
- index: 当前元素的索引
- arr: 表示arr数组
- 需要注意的是:reduce如果不传递第二个参数,那么第一次调用回调函数时四个参数分别为
arr[0],arr[1],1,arr。也就是说如果不传递初始参数,那么数组的第一个元素当作初始参数,并且从数组索引为1处开始累加
代码参考
Array.prototype._reduce = function (fn, prev) {
if (typeof (fn) !== 'function') return
for (let i = 0; i < this.length; i++) {
// 如果不传递prev,那么第一次调用时传递的初始参数就默认为数组的第一个元素,累加元素为数组索引为1处的元素
if (prev === undefined) {
prev = fn(this[i], this[i + 1], i + 1, this)
// 此时i为1,但是下一次要从索引为2处开始加,所以这里i++
i++
} else {
// 如果传递了初始参数,那么传递对应参数即可
prev = fn(prev, this[i], i, this)
}
}
// 最后返回prev,prev是一个元素,但不限类型,可能为数组,对象,数字等
return prev
}
// 代码测试:统计句子中出现字母的个数
let arr = 'woainianizhidaoma'.split('')
console.log(arr._reduce((pre, cur) => {
pre[cur] ? pre[cur]++ : pre[cur] = 1
return pre
}, {}))