js手写-Reduce方法

130 阅读1分钟

手写Reduce方法

  • 重点1: 首先要知道reduce的参数是什么?
    • reduce的第一个参数是回调函数, 第二个参数是初始值
    • 回调函数是遍历数组每一项都要执行的函数
  • 重点2: 第一个参数是函数, 那么这个函数的参数是什么?
    • 有四个参数
    • 第一个参数是, 上一次调用回调函数的结果
    • 第二个参数是, 当前元素的值
    • 第三个参数是, 当前元素在数组中的索引
    • 第四个参数是, 调用reduce方法的数组本身
const arr = [9,2,3,4,5,6]
// 调用本来的reduce方法
console.log(
    '第一个' +
    arr.reduce((acc, cur, index) => {
        acc += cur + index
        return acc
    }, 2)
);

//  fn 的四个参数 
// (上一次调用 callbackFn 的结果, 
//  当前元素的值, 
/// 当前元素的值在数组中的索引位置, 
// 调用了 reduce()  // 的数组本身。)
Array.prototype.myReduce =  function (fn, initVal)  {
    // 拿到当前数组
    const that = this
    if(!that.length) return

    // 如果有初始值, 就从数组的第一个开始累加, 
    // 如果没有, 就把索引为0当作初始值, 所以从索引为1开始
    let index = initVal ? 0 : 1
    let acc = initVal ? initVal: that[0]

    // 开始遍历数组, 每一项都得执行回调函数fn 后 赋值给acc 也就是上一次的计算结果
    for(let i = index; i < that.length; i++) {
        let cur = that[i]
        acc = fn(acc, cur, i, that)
    }

    return acc

}  

// 这是自己写的方法, 调用,  结果是一样的
console.log(
    '第二个' +
    arr.myReduce((acc, cur, index) => {
        acc += cur + index
        return acc
    }, 2)
);

uTools_1688008501265.png