原生JS实现Array.prototype.reduce()方法

官方文档解释:

定义:

Array.prototype.reduce()

reduce() 方法对数组中的每个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值。

参数:

callback

执行数组中每个值 (如果没有提供 initialValue则第一个值除外)的函数,包含四个参数:            ​​​​​​​        accumulator:累计器累计回调的返回值; 它是上一次调用回调时返回的累积值,或initialValue(见于下方)。

        currentValue:数组中正在处理的元素   

  index 可选:数组中正在处理的当前元素的索引。 如果提供了initialValue,则起始索引号为0,否则从索引1起始。

  array可选:调用reduce()的数组

initialValue可选

作为第一次调用 callback函数时的第一个参数的值。 如果没有提供初始值,则将使用数组中的第一个元素。 在没有初始值的空数组上调用 reduce 将报错。

值得注意的是:回调函数第一次执行时,accumulator 和currentValue的取值有两种情况:如果调用reduce()时提供了initialValueaccumulator取值为initialValuecurrentValue取数组中的第一个值;如果没有提供 initialValue,那么accumulator取数组中的第一个值,currentValue取数组中的第二个值

<script>
        // Array.prototype.myReduce(),效果等同于Array.prototype.reduce()
        //将其结果汇总为单个返回
        var arr = [1,2,3,4,5,6,6,7,8,9,10];
        var result1 = arr.reduce(function(prev,current,index,arr) {
            console.log("++++++++",prev)
            return prev+current
        },10);
        var result3 = arr.reduce(function(prev,current,index,arr) {
            console.log(",,,,,,,,",prev)
            return prev+current
        });
        console.log(result1);
        console.log(result3);
        console.log("-----------------------------------------");
        // Array.prototype.myReduce = function(callback,initialValue) {
        //     if(initialValue !== undefined) {//存在
        //         for(var i = 0; i < this.length; i++) {
        //             num = callback(initialValue,this[i],i,this);
        //             initialValue = num;
        //         };
        //         return initialValue;
        //     }else {
        //         initialValue = this[0];
        //         // console.log("initialValue[0]",initialValue);
        //         for(var j = 1;j < this.length; j++) {
        //             num = callback(initialValue,this[j],j,this);
        //             initialValue = num;
        //             // console.log("num",num);
        //             // console.log("initialValue",initialValue);
        //         }
        //         return initialValue;
        //     }
        // }

        //优化后
        Array.prototype.myReduce = function(callback,prev) {
            //判断遍历开始时候的下标
            //存在就是循环以0开始,不存在循环就以1(下标)开始
            var initialValue = prev === undefined?1:0;
            prev = prev === undefined?this[0]:prev;
            for(var i = initialValue;i < this.length;i++) {
                prev = callback(prev,this[i],i,this);
            }
            return prev;
        }
        
        var result2 = arr.myReduce(function(prev,current,index,arr) {
            console.log("-------"+prev)
            return prev+current
        },10)

        var result4 = arr.myReduce(function(prev,current,index,arr) {
            console.log("=======",prev)
            return prev+current
        })
        console.log(result2);
        console.log(result4);
    </script>

       

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值