详解JavaScript中数组的reduce方法


Posted in Javascript onDecember 02, 2016

介绍

我们先来看看这个方法的官方概述:reduce() 方法接收一个函数作为累加器(accumulator),数组中的每个值(从左到右)开始缩减,最终为一个值。

你一定也和我一样看的有点迷糊,其实reduce接收的就是一个回调函数,去调用数组里的每一项,直到数组结束。

我们来举个例子大家就很明白了。

假设我有一串数组,数组里放的全是数字,我要算出这些数字的总和是多少。正常情况下我们会循环,然后一个个加,有了reduce就不用那么麻烦了,只用一行代码。

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

这个方法是如何工作的呢?

reduce接受一个函数,函数有四个参数,分别是:

     1、上一次的值;

     2、当前值;

     3、当前值的索引;

     4、数组;

我们还是以上面那个数组为例,把这几个参数打印出来看看:

[0, 1, 2, 3, 4].reduce(function(previousValue, currentValue, index, array){
 return previousValue + currentValue;
});

得到的结果是:

详解JavaScript中数组的reduce方法

分析一下这个结果,这个回调函数共调用了4次,因为第一次没有previousValue,所以直接从数组的第二项开始,一只调用到数组结束。

reduce还有第二个参数,我们可以把这个参数作为第一次调用callback时的第一个参数,上面这个例子因为没有第二个参数,所以直接从数组的第二项开始,如果我们给了第二个参数为5,那么结果就是这样的:

[0, 1, 2, 3, 4].reduce(function(previousValue, currentValue, index, array){
 return previousValue + currentValue;
},5);

详解JavaScript中数组的reduce方法

第一次调用的previousValue的值就用传入的第二个参数代替,函数被调用了5次,也就是数组的length

reduce可以帮助我们轻松的完成很多事,除了累加,还有扁平化一个二维数组:

var flattened = [[0, 1], [2, 3], [4, 5]].reduce(function(a, b) {
 return a.concat(b);
}, []);
// flattened == [0, 1, 2, 3, 4, 5]

总结

我暂时能想到的常用的就这两个,不过肯定还有很多地方能用到啦。以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
基于jquery的loading效果实现代码
Nov 05 Javascript
基于Jquery+Ajax+Json的高效分页实现代码
Oct 29 Javascript
jQuery控制图片的hover效果(smartRollover.js)
Mar 18 Javascript
jQuery实现的原图对比窗帘效果
Jun 15 Javascript
seajs加载jquery时提示$ is not a function该怎么解决
Oct 23 Javascript
jQuery使用方法
Feb 04 Javascript
Bootstrap布局之栅格系统学习笔记
May 04 Javascript
原生JS实现图片无缝滚动方法(附带封装的运动框架)
Oct 01 Javascript
Vue中使用sass实现换肤功能
Sep 07 Javascript
vue生命周期的探索
Apr 03 Javascript
解决vue组件中click事件失效的问题
Nov 09 Javascript
详解js location.href和window.open的几种用法和区别
Dec 02 Javascript
基于javascript实现按圆形排列DIV元素(二)
Dec 02 #Javascript
微信公众平台开发教程(六)获取个性二维码的实例
Dec 02 #Javascript
Bootstrap Modal对话框如何在关闭时触发事件
Dec 02 #Javascript
基于javascript实现按圆形排列DIV元素(一)
Dec 02 #Javascript
关于Function中的bind()示例详解
Dec 02 #Javascript
bootstrap模态框消失问题的解决方法
Dec 02 #Javascript
谈谈因Vue.js引发关于getter和setter的思考
Dec 02 #Javascript
You might like
php一个文件搞定微信jssdk配置
2016/12/12 PHP
PHP CURL采集百度搜寻结果图片不显示问题的解决方法
2017/02/03 PHP
php查看一个变量的占用内存的实例代码
2020/03/29 PHP
jQuery 打造动态渐变按钮 详细图文教程
2010/04/25 Javascript
JQuery 绑定select标签的onchange事件,弹出选择的值,并实现跳转、传参
2011/01/06 Javascript
利用javascript判断文件是否存在
2013/12/31 Javascript
jquery.post用法示例代码
2014/01/03 Javascript
含有CKEditor的表单如何提交
2014/01/09 Javascript
JavaScript关闭当前页面(窗口)不带任何提示
2014/03/26 Javascript
javascript去除字符串中所有标点符号和提取纯文本的正则
2014/06/07 Javascript
jquery实现图片上传之前预览的方法
2015/07/11 Javascript
jQuery Validate初步体验(二)
2015/12/12 Javascript
js 弹出虚拟键盘修改密码的简单实例
2016/10/10 Javascript
浅谈Node异步编程的机制
2017/10/18 Javascript
express如何使用session与cookie的方法
2018/01/30 Javascript
Nodejs使用Mongodb存储与提供后端CRD服务详解
2018/09/04 NodeJs
js瀑布流布局的实现
2020/06/28 Javascript
[01:00:35]2018DOTA2亚洲邀请赛3月30日B组 EffcetVSMineski
2018/03/31 DOTA
[01:12:40]DOTA2-DPC中国联赛 正赛 DLG vs XG BO3 第三场 1月25日
2021/03/11 DOTA
Python实现基本数据结构中栈的操作示例
2017/12/04 Python
用matplotlib画等高线图详解
2017/12/14 Python
Python键盘输入转换为列表的实例
2018/06/23 Python
python Dijkstra算法实现最短路径问题的方法
2019/09/19 Python
浅谈pandas.cut与pandas.qcut的使用方法及区别
2020/03/03 Python
python 如何上传包到pypi
2020/12/24 Python
CSS3实现swap交换动画
2016/01/19 HTML / CSS
非常漂亮的CSS3百叶窗焦点图动画
2016/02/24 HTML / CSS
Shopping happy life西班牙:以最优惠的价格提供最好的时尚配饰
2020/03/13 全球购物
Ref与out有什么不同
2012/11/24 面试题
什么是索引指示器
2012/08/20 面试题
总务岗位职责
2013/11/19 职场文书
学生自我鉴定
2013/12/18 职场文书
班组安全员工作职责
2014/02/01 职场文书
《最后一头战象》教学反思
2016/02/16 职场文书
《女娲补天》教学反思
2016/02/20 职场文书
Python数组变形的几种实现方法
2022/05/30 Python