解析JavaScript数组方法reduce


Posted in Javascript onDecember 12, 2016

Array.prototype.reduce()

概述

reduce()方法是数组的一个实例方法(共有方法),可以被数组的实例对象调用。reduce() 方法接收一个函数作为累加器(accumulator),数组中的每个值(从左到右)开始缩减,最终为一个值。

语法

arr.reduce(callback[, initialValue]) {}

参数

回调函数中可以传递四个参数。

previousValue:上一次调用回调函数返回的值,或者是提供的初始值(initialValue)

currentValue:数组中当前被处理的元素

currentIndex:当前被处理元素在数组中的索引, 即currentValue的索引.如果有initialValue初始值, 从0开始.如果没有从1开始

array:调用 reduce 的数组

initialValue:可选参数, 作为第一次调用 callback 的第一个参数

返回值

reduce()返回值是最后一次调用回调函数返回的结果

描述

reduce 为数组中的每一个元素依次执行回调函数,不包括数组中被删除或从未被赋值的元素,接受四个参数:

  1. previousValu 上一次值
  2. currentValue 当前值
  3. currentIndex 当前值的索引
  4. array 数组

回调函数第一次执行时,previousValue 和 currentValue可能是两个不同值其中的一个,如果reduce有initialValue参数,那么 previousValue 等于 initialValue ,并且currentValue 等于数组中的第一个值;如果reduce没有 initialValue 参数,那么previousValue 等于数组中的第一个值,currentValue等于数组中的第二个值。

注意: 如果没有initialValue参数, reduce从index为1开始执行回调函数, 跳过第一个index。 如果有initialValue参数, reduce 将从index为 0 开始执行回调

如果数组是空的并且没有initialValue参数, 将会抛出TypeError错误. 如果数组只有一个元素并且没有初始值initialValue, 或者有initialValue但数组是空的, 这个唯一的值直接被返回而不会调用回调函数。

通常来说提供一个initialValue初始值更安全一点, 因为没有的话会出现如下输出结果。

//没有提供initialValue
function foo(){
 return [1,2,3,4,5].reduce((x, y) => x + y); //15
};
console.log(foo.call(this));
function foo(){
 return [].reduce((x, y) => x + y); //TypeError
};
console.log(foo.call(this));
//提供initialValue
function foo(){
 return [].reduce((x, y) => x + y, 0); //0
};
console.log(foo.call(this));

reduce()是如何工作的

[0, 1, 2, 3, 4].reduce((previousValue, currentValue, index, array) => previousValue + currentValue);

回调被执行四次,每次的参数和返回值如下表:

解析JavaScript数组方法reduce

reduce 的返回值是回调函数最后一次被调用的返回值(10)。

如果把初始值作为第二个参数传入 reduce,结果如下,结果如下:

[0, 1, 2, 3, 4].reduce((previousValue, currentValue, index, array) => previousValue + currentValue, 10);

解析JavaScript数组方法reduce

最后一次函数调用的返回值 (20) 作为reduce函数的结果被返回

注意:添加了initialValue参数会多调用一次回调函数

例题

将数组所有项相加

let sum = [0, 1, 2, 3, 4].reduce((x, y) => x + y, 0); 
// 10

扁平化一个二维数组

let arr = [[1, 2], [3, 4], [5, 6]].reduce((x, y) => x.concat(y), []);
// [1, 2, 3, 4, 5, 6]

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
js 编写规范
Mar 03 Javascript
web开发人员学习jQuery的6大理由及jQuery的优势介绍
Jan 03 Javascript
showModelDialog弹出文件下载窗口的使用示例
Nov 19 Javascript
javascript回车完美实现tab切换功能
Mar 13 Javascript
浅谈javascript的调试
Jan 28 Javascript
浅谈JavaScript函数的四种存在形态
Jun 08 Javascript
jQuery的Each比JS原生for循环性能慢很多的原因
Jul 05 Javascript
通过扫描二维码打开app的实现代码
Nov 10 Javascript
Angular.Js的自动化测试详解
Dec 09 Javascript
vue.js,ajax渲染页面的实例
Feb 11 Javascript
JQuery Ajax执行跨域请求数据的解决方案
Dec 10 jQuery
node.js使用yargs处理命令行参数操作示例
Feb 11 Javascript
实例分析浏览器中“JavaScript解析器”的工作原理
Dec 12 #Javascript
JS双击变input框批量修改内容
Dec 12 #Javascript
jQuery中animate的几种用法与注意事项
Dec 12 #Javascript
Websocket协议详解及简单实例代码
Dec 12 #Javascript
jQuery中值得注意的trigger方法浅析
Dec 12 #Javascript
jQuery实现字符串全部替换的方法
Dec 12 #Javascript
Radio 单选JS动态添加的选项onchange事件无效的解决方法
Dec 12 #Javascript
You might like
海河写的 Discuz论坛帖子调用js的php代码
2007/08/23 PHP
PHP数字前补0的自带函数sprintf 和number_format的用法(详解)
2017/02/06 PHP
自制PHP框架之路由与控制器
2017/05/07 PHP
PHP精确到毫秒秒杀倒计时实例详解
2019/03/14 PHP
Javascript(AJAX)解析XML的代码(兼容FIREFOX/IE)
2010/07/11 Javascript
juqery 学习之四 筛选过滤
2010/11/30 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(五)可移动地图的实现
2013/01/23 Javascript
JavaScript中九种常用排序算法
2014/09/02 Javascript
node.js中的buffer.Buffer.isBuffer方法使用说明
2014/12/14 Javascript
JS+CSS实现可以凹陷显示选中单元格的方法
2015/03/02 Javascript
javascript实现网页端解压并查看zip文件
2015/12/15 Javascript
Bootstrap 折叠(Collapse)插件用法实例详解
2016/06/01 Javascript
jquery实现跳到底部,回到顶部效果的简单实例(类似锚)
2016/07/10 Javascript
利用Chrome DevTools直接调试Node.js和JavaScript的方法详解(并行)
2017/02/16 Javascript
Vue.js学习笔记之常用模板语法详解
2017/07/25 Javascript
JavaScript中正则表达式判断匹配规则及常用方法
2017/08/03 Javascript
javascript填充默认头像方法
2018/02/22 Javascript
Vue 路由 过渡动效 数据获取方法
2018/07/31 Javascript
Javascript 之封装(Package)
2018/09/14 Javascript
JavaScript实现图片上传并预览并提交ajax
2019/09/30 Javascript
微信小程序自定义弹出层效果
2020/05/26 Javascript
Vue 实现v-for循环的时候更改 class的样式名称
2020/07/17 Javascript
Vue 401配合Vuex防止多次弹框的案例
2020/11/11 Javascript
[01:04:14]OG vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
[58:29]DOTA2-DPC中国联赛 正赛 Phoenix vs XG BO3 第一场 1月31日
2021/03/11 DOTA
[01:19:46]DOTA2-DPC中国联赛 正赛 SAG vs DLG BO3 第一场 2月28日
2021/03/11 DOTA
Python3.6连接Oracle数据库的方法详解
2018/05/18 Python
python 多线程对post请求服务器测试并发的方法
2019/06/13 Python
python 6行代码制作月历生成器
2020/09/18 Python
Python通过Schema实现数据验证方式
2020/11/12 Python
Python约瑟夫生者死者小游戏实例讲解
2021/01/04 Python
英国性能汽车零件和发动机配件在线:Maxpeedingrods
2019/11/05 全球购物
个人培训自我鉴定
2014/03/28 职场文书
2014乡镇党委副书记对照检查材料思想汇报
2014/10/09 职场文书
寒假社会实践个人总结
2015/03/06 职场文书
国庆节主题班会
2015/08/15 职场文书