手写JS 数组方法之 你不知道的 Array.Reduce

158 阅读1分钟

reduce()

  • 关于reduce MDN 文档的介绍 : image.png
const array1 = [1, 2, 3, 4];
// 0 + 1 + 2 + 3 + 4
const initialValue = 0;
const sumWithInitial = array1.reduce(
  (accumulator, currentValue) => accumulator + currentValue,
  initialValue
);
console.log(sumWithInitial); // Expected output: 10
  • reduce 逐个遍历数组元素,每一步都将当前元素的值与上一步的计算结果相加(上一步的计算结果是当前元素之前所有元素的总和)——直到没有更多的元素被相加。

  • 参数介绍: image.png

  • reduce 的介绍就到这里 不理解的小伙伴可以查阅官方资料 developer.mozilla.org/en-US/docs/…

  • 接下来我们进入本文关键探索一下如何实现一个 自己的 reduce 方法

实现 reduce 上代码

  1. 添加Array 数组原型方法
Array.prototype.myReduce = myReduce;
  1. 创建该方法
// 手写 reducer
function myReduce(callback , initialValue) {
    // this 为当前调用的数组 [15, 16, 17, 18, 19]
    let dataArray = [...this]; // 使用深拷贝进行处理 (这里我简单使用了es6 的数组解析处理 浅拷贝)
    if(initialValue){
        dataArray.unshift(initialValue);
    }
    let callBackValeu = initialValue;
    for (let index = 0; index < dataArray.length - 1; index++) {
        // 目前传递了两个参数 如果觉得参数不够可自由传递
        callBackValeu = callback(callBackValeu == initialValue ? dataArray[index] : (callBackValeu) , dataArray[index + 1] );
    }
    return callBackValeu;
}
  1. 使用
// reduce无第二个参数情况下
const value = [15, 16, 17, 18, 19].myReduce((previousValue, currentValue) => {
    return previousValue + currentValue;
});
console.log(value); // output value: 85;

// reduce有第二个参数情况下
const value = [15, 16, 17, 18, 19].myReduce((previousValue, currentValue) => {
    return previousValue + currentValue;
},100);
console.log(value); // output value: 185;

此处涉及到 计算的问题相信都知道js计算会有些误差

以上是个人实现 reduce 的思路以及代码 如有更好的思路欢迎小伙伴们一起讨论;