1.reduce语法

array.reduce(function(pre, currentValue, currentIndex, arr), initialValue)

  1. recude函数接收两个参数,一个为回调函数,一个为初始赋值
  2. 第一个参数的回调函数又接收四个参数,分别为(初始值或计算结束后的返回值,当前元素,当前元素的索引,当前元素所属的数组对象)
  3. 第二个参数是传给函数的初始值,非必传

2.实例解析

var arr = [1, 2, 3, 4];
var sum = arr.reduce(function (prev, cur, index, arr) {console.log(prev, cur, index);return prev + cur;
});
console.log(arr, sum);

打印结果
1 2 1
3 3 2
6 4 3
[ 1, 2, 3, 4 ] 10

上面的例子index是从1开始的,第一次的prev的值是数组的第一个值。数组长度是4,reduce函数循环3次。

接下来给initvalue赋予初始值0

var arr = [1, 2, 3, 4];
var sum = arr.reduce(function (prev, cur, index, arr) {console.log(prev, cur, index);return prev + cur;
}, 0);
console.log(arr, sum);

打印结果
0 1 0
1 2 1
3 3 2
6 4 3
[ 1, 2, 3, 4 ] 10

这个例子index是从0开始的,第一次的prev的值是我们设置的初始值0,数组长度是4,reduce函数循环4次。

总结:如果没有提供initialValue,reduce 会从索引1的地方开始执行 callback 方法,跳过第一个索引。如果提供initialValue,从索引0开始。

3.结合例题深入理解

(1)计算数组累积结果

var arr = [1, 2, 3, 4];
var sum = arr.reduce(function (prev, cur, index, arr) {return prev * cur;
}, 1);
console.log(arr, sum);

打印结果
[ 1, 2, 3, 4 ] 24

(2)计算数组中每个元素出现的次数

var arr = ["one", "two", "three", "six", "four", "five", "six"];var newArr = arr.reduce((pre, cur) => {console.log(cur, pre);if (cur in pre) {pre[cur]++;} else {pre[cur] = 1;}return pre;
}, {});//这里注意初始值要默认赋予空对象,不然会报错
console.log(newArr);

打印结果
one {}
two { one: 1 }
three { one: 1, two: 1 }
six { one: 1, two: 1, three: 1 }
four { one: 1, two: 1, three: 1, six: 1 }
five { one: 1, two: 1, three: 1, six: 1, four: 1 }
six { one: 1, two: 1, three: 1, six: 1, four: 1, five: 1 }
{ one: 1, two: 1, three: 1, six: 2, four: 1, five: 1 }

(3)数组去重

let arr = [1,2,3,4,4,1]
let newArr = arr.reduce((pre,cur)=>{if(!pre.includes(cur)){return pre.concat(cur)}else{return pre}
},[])
console.log(newArr);

打印结果
[1, 2, 3, 4]

(4)数组扁平化 二维转一维

let arr = [[0, 1], [2, 3], [4, 5]]
let newArr = arr.reduce((pre,cur)=>{return pre.concat(cur)
},[])
console.log(newArr);

打印结果
[0, 1, 2, 3, 4, 5]

(5)数组扁平化 多维转一维

let arr = [[0, 1], [2, 3], [4,[5,6,7]]]
const newArr = function(arr){return arr.reduce((pre,cur)=>pre.concat(Array.isArray(cur)?newArr(cur):cur),[])
}
console.log(newArr(arr));

打印结果
[0, 1, 2, 3, 4, 5, 6, 7]

(6)对象属性求和

var result = [{subject: 'math',score: 10},{subject: 'chinese',score: 20},{subject: 'english',score: 30}
];var sum = result.reduce(function(prev, cur) {return cur.score + prev;
}, 0);
console.log(sum)

打印结果
60

Js_reduce用法详解(超详细!!!)相关推荐

  1. Java 泛型详解(超详细的java泛型方法解析)

    Java 泛型详解(超详细的java泛型方法解析) 1. 什么是泛型 泛型:是一种把明确类型的工作推迟到创建对象或者调用方法的时候才去明确的特殊的类型.也就是说在泛型使用过程中,操作的数据类型被指定为 ...

  2. mysql 联表比对,MySQL联表查询详解/超详细mysql left join,right join,inner join用法分析比较...

    超详细mysql left join,right join,inner join用法分析 下面是例子分析 表A记录如下: aID aNum 1 a20050111 2 a20050112 3 a200 ...

  3. log4j 配置详解(超详细)

    一.Log4j简介 Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局).这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出.综合使 ...

  4. 【bind()函数】JavaScript手写bind()及详解-超详细~~~

    这两天学习了手写call.apply.bind,手写bind思考了很久才实现了MDN的示例的结果,所以记录下来~ 因为是第一篇文章,所以可能存在一些错误,希望各位大佬批评指正,不吝赐教. 也欢迎不懂的 ...

  5. @Autowired注解详解——超详细易懂

    @Autowired详解 要搞明白@Autowired注解就是要了解它是什么?有什么作用?怎么用?为什么? 首先了解一下IOC操作Bean管理,bean管理是指(1)spring创建对象 (2)spr ...

  6. 斜率优化详解(超详细, 有图有代码有注释)

    文章目录 斜率优化引入 从例题开始 斜率优化Part 1: 推为斜率式 斜率优化Part 2: 合法点集的斜率单调性 Part 3: 找到最优决策点 Part 4: 斜率优化大流程 Part 5: 斜 ...

  7. 一、初识Metasploit(MSF使用详解超详细)

    前言:Metasploit是The Metasploit Framework的简称,也可以叫做MSF! MSF高度模块化即框架由多个module组成,是全球最受欢迎的工具. Metasploit Fr ...

  8. web服务器常见配置搭建详解(超详细)

    前言: 本博客借鉴一些写的比较好的博客,进行归纳总结,整理了一篇比较详细的服务器常见配置搭建教程 一来是和大家一起分享,二来也是作为自己的学习笔记记录一下. 温馨提示: 篇幅较长,请分阶段选择性查看. ...

  9. 计算机网络 - IPv4 常考知识点详解(超详细!)

    目录 一.IPv4分组 1.IPv4分组的格式 2.IP数据报分片 3.网络层转发分组的流程 二.IPv4地址与NAT 1.IPv4地址 2.NAT 三.子网划分与子网掩码.CIDR 1.子网划分 2 ...

最新文章

  1. Sqlserver的触发器的简单使用
  2. google浏览器插件安装时出错,Package is invalid: CRX HEADER INVALID
  3. 前后端分离中使用基于jwt的token进行身份认证
  4. 热泵精馏_精馏干货16 || 分子蒸馏
  5. php尿,Java/Python/PHP/C 图文详解它们之间的尿性
  6. 实现WP7下ListBox分页加载接口
  7. JavaScript自学笔记 第5次
  8. 【图像加密】基于matlab RSA图像加密解密【含Matlab源码 1442期】
  9. PHP汉字转换拼音的函数代码
  10. 手把手教你安装Keil
  11. 乐动手环app下载安装_乐动手环app下载安装
  12. vue导入音乐_【vlog制作】不经电脑,如何在VUE中导入自定义音乐
  13. 初体验 | 购买激活Typora软件
  14. BugKu -- AWD --S1排位赛-4
  15. Paypal支付/回调/退款
  16. 共享虚拟机是什么意思_苹果笔记本电脑MacBook双系统or虚拟机选择指南
  17. 知识图谱综述及技术地图概览(智能问答系统)
  18. [极客大挑战 2019]Buy Flag1(BUUCTF)
  19. MongoDB服务启动
  20. 中科大-凸优化 笔记(lec25)-等价变换

热门文章

  1. 【计算机毕业文章】贝儿米幼儿教育管理系统设计与实现
  2. css 边框太粗_CSS如何怎么设置div边框颜色宽度和高度
  3. OSVR Reset Yaw
  4. 写一篇过往与憧憬:致程序员
  5. USB OTG 检测原理
  6. ifreq ifr 配置网口信息
  7. 主机中的图片库传到虚拟机中
  8. 《软件测试》学习笔记(自整理)
  9. CSS盒子模型(Box Model)
  10. 【模电实验】【验证性实验——单管共发射极放大电路实验】