美文网首页
ES5-Array-reduce/reduceRight

ES5-Array-reduce/reduceRight

作者: chrisghb | 来源:发表于2019-06-10 22:21 被阅读0次

    参考文章:reduce(),reduceRight()

    注意:使用reduce前要判断数组length>0,否则会抛异常

    reduce方法和reduceRight方法依次处理数组的每个成员,最终累计为一个值。它们的差别是:

    • reduce是从左到右处理(从第一个成员到最后一个成员)
    • reduceRight则是从右到左(从最后一个成员到第一个成员,也就是将数组倒序排列后当reduce处理),其他完全一样。

    reduce方法和reduceRight方法的第一个参数都是一个回调函数。该函数接受以下四个参数。

    1. 累积变量,默认为数组的第一个成员(必须)
    2. 当前变量,默认为数组的第二个成员(必须)
    3. 当前位置(从0开始)(可选)
    4. 原数组(可选)

    这四个参数之中,只有前两个是必须的,后两个则是可选的。

    [1, 2, 3, 4, 5].reduce(function (a, b) {
      console.log(a, b);
      return a + b;
    })
    // 1 2
    // 3 3
    // 6 4
    // 10 5
    //最后结果:15
    

    上面代码中,reduce方法求出数组所有成员的和。

    第一次执行,a是数组的第一个成员1,b是数组的第二个成员2。

    第二次执行,a为上一轮的<font color=red>返回值</font>
    3,b为第三个成员3。

    第三次执行,a为上一轮的返回值6,b为第四个成员4。

    第四次执行,a为上一轮返回值10,b为第五个成员5。至此所有成员遍历完成,整个方法的返回值就是最后一轮的返回值15。

    • 注意:如果数组只有一个元素,回调函数不执行,直接返回数组里面的元素。

    如果要对累积变量指定初值,可以把它放在reduce方法和reduceRight方法的第二个参数(相当于对数组unshift一个元素)。

    [1, 2, 3, 4, 5].reduce(function (a, b) {
      return a + b;
    }, 10);
    // 25
    

    上面代码指定参数a的初值为10,所以数组从10开始累加,最终结果为25。注意,这时b是从数组的第一个成员"1"开始遍历。

    上面的第二个参数相当于设定了默认值,处理空数组时很有用。

    function add(prev, cur) {
      return prev + cur;
    }
    
    [].reduce(add)
    // TypeError: Reduce of empty array with no initial value
    [].reduce(add, 1)
    // 1
    

    上面代码中,由于空数组取不到初始值,reduce方法会报错。这时,加上第二个参数,就能保证总是会返回一个值。

    • 有了reduce,我们可以结合concat轻松实现二维数组的扁平化
    var matrix = [
      [1, 2],
      [3, 4],
      [5, 6]
    ];
    
    // 二维数组扁平化
    var flatten = matrix.reduce(function (previous, current) {
      return previous.concat(current);
    });
    
    console.log(flatten); // [1, 2, 3, 4, 5, 6]
    

    扁平化另一种实现方式:

    var matrix = [
      [1, 2],
      [3, 4],
      [5, 6]
    ];
    let rlt = [];
    matrix.foreach(dics=>{
        rlt.push(...dics);
    })
    
    • reduce实现取数组中的最大值:
    arr = [3, 9, 6];
    var max = arr.reduce(function(x, y) {
         console.log(x + "|" + y);
         return x > y ? x : y;
    });
    // 3|9
    // 9|6
    max; // 9
    

    下面是一个reduceRight方法的例子。

    function substract(prev, cur) {
      return prev - cur;
    }
    
    [3, 2, 1].reduce(substract) // 0
    [3, 2, 1].reduceRight(substract) // -4
    

    上面代码中,reduce方法相当于3减去2再减去1,reduceRight方法相当于1减去2再减去3。

    由于这两个方法会遍历数组,所以实际上还可以用来做一些遍历相关的操作。比如,找出字符长度最长的数组成员。

    function findLongest(entries) {
      return entries.reduce(function (longest, entry) {
        return entry.length > longest.length ? entry : longest;
      }, '');
    }
    
    findLongest(['aaa', 'bb', 'c']) // "aaa"
    

    上面代码中,reduce的参数函数会将字符长度较长的那个数组成员,作为累积值。这导致遍历所有成员之后,累积值就是字符长度最长的那个成员。

    相关文章

      网友评论

          本文标题:ES5-Array-reduce/reduceRight

          本文链接:https://www.haomeiwen.com/subject/elhxfctx.html