• reduce方法和reduceRight方法


    什么是reduce方法?

    先来看一下用用法:

    var arr = [1, 2, 3, 4]
    var sum = (a, b) => a + b
    arr.reduce(sum, 0) // 10

    由上面代码可以看出,reduce对数组arr的每一个成员执行了sum函数。sum的参数a是累积变量,参数b是当前的数组成员。每次执行时,b会回到a,最后输出a。

    累积变量必须有一个初始值,上例是reduce函数的第二个参数0,如果省略该参数,那么初始值默认是数组的第一个成员。

    var arr = [1, 2, 3, 4]
    
    var sum = function(a, b) {
        console.log(a, b);
        return a + b
    }
    
    arr.reduce(sum) // => 10
    
    // 1 2
    // 3 3
    // 6 4

    reduce省略了初始值,通过sum函数里面的打印语句,可以看到累积变量每一次的变化。reduce方法提供了一种遍历手段,对数组所有成员进行‘累积’处理。

    既然是遍历,那它跟 for 、 while有什么不同呢?

    for :

    var arr = [1, 2, 3, 4]
    Array.prototype.sum = function () {
        var sumResult = 0;
        for (var i = 0; i < this.length; i++) {
            sumResult += parseInt(this[i]);
        }
        return sumResult;
    }
    
    arr.sum(); // 10

    while 

    var arr = [1, 2, 3, 4]
    Array.prototype.sum = function() {
        var sumResult = 0;
        var i = this.length;
        while (i--) {
            sumResult += parseInt(this[i]);
        }
        return sumResult;
    }
    
    arr.sum() // 10

    以上代码都能实现reduce的功能,那为何还要搞这玩意呢? 

    一般来说类似的方法比较都会是性能方面的比较,来看看各自的耗时

    var arr = [1, 2, 3, 4]
    
    console.time('forLoop');
    
    Array.prototype.forLoop = function() {
        for (var i = 0; i < 10000; i++) {
            var sumResult = 0;
            for (var j = 0; j < this.length; j++) {
                sumResult += parseInt(this[j]);
            }
        return sumResult;
    }
    
    arr.forLoop();
    console.log('最终的值:' + arr.forLoop()) // 10
    console.timeEnd('forLoop')

       

    var arr = [1, 2, 3, 4]


    console.time('whileLoop') Array.prototype.whileLoop = function() { var _this = this for(var i = 0; i < 10000; i++) { var sumResult = 0; var len = _this.length; while(len--) { sumResult += parseInt(_this[len]); } } return sumResult; } arr.whileLoop() console.log('最终的值:' + arr.whileLoop()) console.timeEnd('whileLoop')

      

    经多次运行测试发现 10000次运行使用for循环 和while的时间大致相当,大概需要 4 - 7ms 不等!

    那reduce呢? 

    var arr = [1, 2, 3, 4]
    
    console.time('reduce')
    
    Array.prototype.reduceSum = function() {
        for (var i = 0; i < 10000; i++) {
            return this.reduce(function(preValue, curValue) {
                return preValue + curValue;
            });
        }
    }
    
    arr.reduceSum();
    console.log('最终的值:' + arr.reduceSum()) // 10
    console.timeEnd('reduce')

      

    可见,时间大概在1-3ms之间,耗时情况一目了然!

    reduceRight()方法

    reduceRight() 方法的功能和reduce()功能是一样的,不同的是reduceRight() 从数组的末尾向前将数组中的数组项做累加。

    reduceRight() 首次调用回调函数callbackfn 时,preValue 和 curValue 可以是两个值之一。如果调用reduceRight()时提供了第二个参数,则preValue等于该参数,curValue等于数组中的最后一个值。如果没有提供,则preValue等于数组最后一个值,curValue等于数组中倒数第二个值。

    var arr = [0, 1, 2, 3, 4];
    
    arr.reduceRight(function(preValue, curValue, index, array) {
        console.log(preValue, curValue)
       return preValue + curValue; 
    }); // 10
    
    // 4 3
    // 7 2
    // 9 1
    // 10 0
    
    
    arr.reduceRight(function(preValue, curValue, index, array) {
       console.log(preValue, curValue)
       return preValue + curValue; 
    }, 5) // 15
    
    // 5 4
    // 9 3
    // 12 2
    // 14 1
    // 15 0

    相关文章: https://www.w3cplus.com/javascript/array-part-8.html 、 http://www.ruanyifeng.com/blog/2017/03/reduce_transduce.html

  • 相关阅读:
    重写JSON的部分用fetch的API
    给网站插入一个百度地图API
    给网站写一个JSON,并远程请求。
    Object的起源及一个函数的标准形式、mechanism分析
    js中关于for 的几个函数及关于构造器或结构体与对象的关系及Arrow functions
    program的发展史及own forecast(后面的才是干货)
    indexof函数分析及其计数字符串函数、正则表达式的例子及分析
    DOM&BOM(source、methods、contents、Application)
    CSS单位分析及CSS颜色表示法、颜色表(调色板)
    一个简单的grid布局基础例子注释及相关分析
  • 原文地址:https://www.cnblogs.com/garfieldzhong/p/8058787.html
Copyright © 2020-2023  润新知