js中reduce的实现

reduce回顾

array.reduce(function(total, currentValue, currentIndex, arr), initialValue)
reduce接收两个参数:

  1. 第一个参数为一个回调函数
  2. 第二个参数表示初始值
  3. 回调函数中接收四个参数(pre,cur,index,arr) 分别是
    • pre:上一次调用之后的结果
    • cur: 当前要累加的元素
    • index: 当前元素的索引
    • arr: 表示arr数组
  4. 需要注意的是: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
}, {}))

posted @ 2022-12-16 17:23  含若飞  阅读(181)  评论(0编辑  收藏  举报