博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ES5-Array-reduce/reduceRight
阅读量:6652 次
发布时间:2019-06-25

本文共 2063 字,大约阅读时间需要 6 分钟。

参考文章:

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为上一轮的返回值 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|6max; // 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的参数函数会将字符长度较长的那个数组成员,作为累积值。这导致遍历所有成员之后,累积值就是字符长度最长的那个成员。

转载地址:http://wdito.baihongyu.com/

你可能感兴趣的文章
【Spring学习笔记-5】Spring中的抽象bean以及bean继承
查看>>
Live555中RTP包的打包与发送过程分析
查看>>
基于jQuery/CSS3实现拼图效果的相册插件
查看>>
【问题解决】小数点前面不显示0的问题
查看>>
ios学习笔记(二)第一个应用程序--Hello World
查看>>
Windows下pip安装包报错:Microsoft Visual C++ 9.0 is required Unable to find vcvarsall.bat
查看>>
学习笔记---Javascript事件Event、IE浏览器下的拖拽效果
查看>>
不通用版(从SVN取版本,通过MAVEN生成JAVA包,通过SALTSTACK传送到远程服务器并自动重启TOMCAT服务)PYTHON代码...
查看>>
[Java基础] System.arraycopy使用
查看>>
CSS3 《3D骰子 压大小》
查看>>
在Mac osx使用ADT Bundle踩过的坑
查看>>
HTML+js+css实现点击图片弹出上传文件窗口的两种思路
查看>>
android CircularSeekBar
查看>>
YY博客园UML类图之博客模块
查看>>
陶哲轩1(数学牛孩的成长研究
查看>>
ubuntu14.04安装dropbox
查看>>
[.net 面向对象编程基础] (7) 基础中的基础——流程控制语句
查看>>
学术简历的撰写
查看>>
J2EE总结(2)——Servlet/JSP
查看>>
keyset与entryset
查看>>