解析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 学习笔记 防止发生命名冲突
Jul 30 Javascript
Fastest way to build an HTML string(拼装html字符串的最快方法)
Aug 20 Javascript
通过jQuery源码学习javascript(三)
Dec 27 Javascript
javascript刷新父页面的各种方法汇总
Sep 03 Javascript
php常见的页面跳转方法汇总
Apr 15 Javascript
HTML5 实现的一个俄罗斯方块实例代码
Sep 19 Javascript
Bootstrap Table使用心得总结
Nov 29 Javascript
原生JS实现垂直手风琴效果
Feb 19 Javascript
详解Vue.js分发之作用域槽
Jun 13 Javascript
实例详解Node.js 函数
Jun 10 Javascript
微信小程序3种位置API的使用方法详解
Aug 05 Javascript
axios封装与传参示例详解
Oct 18 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
Php部分常见问题总结
2006/10/09 PHP
使用adodb lite解决问题
2006/12/31 PHP
隐藏你的.php文件的实现方法
2007/03/19 PHP
CodeIgniter多语言实现方法详解
2016/01/20 PHP
客户端脚本中常常出现的一些问题和调试技巧
2007/01/09 Javascript
ASP.NET jQuery 实例10 动态修改hyperlink的URL值
2012/02/03 Javascript
javascript使用isNaN()函数判断变量是否为数字
2013/09/21 Javascript
node.js+Ajax实现获取HTTP服务器返回数据
2014/11/26 Javascript
js控制输入框获得和失去焦点时状态显示的方法
2015/01/30 Javascript
jquery实现选中单选按钮下拉伸缩效果
2015/08/06 Javascript
JS基于封装函数实现的表格分页完整示例
2018/06/26 Javascript
vue登录以及权限验证相关的实现
2019/10/25 Javascript
JS中数组实现代码(倒序遍历数组,数组连接字符串)
2019/12/29 Javascript
Antd的table组件表格的序号自增操作
2020/10/27 Javascript
python网络编程学习笔记(六):Web客户端访问
2014/06/09 Python
python实现的简单RPG游戏流程实例
2015/06/28 Python
Windows系统下使用flup搭建Nginx和Python环境的方法
2015/12/25 Python
Python每天必学之bytes字节
2016/01/28 Python
Python Requests 基础入门
2016/04/07 Python
读写json中文ASCII乱码问题的解决方法
2016/11/05 Python
python urllib爬取百度云连接的实例代码
2017/06/19 Python
从请求到响应过程中django都做了哪些处理
2018/08/01 Python
Python中单线程、多线程和多进程的效率对比实验实例
2019/05/14 Python
Python+logging输出到屏幕将log日志写入文件
2020/11/11 Python
通过HTML5 Canvas API绘制弧线和圆形的教程
2016/03/14 HTML / CSS
碧欧泉Biotherm加拿大官方网站:法国高端护肤品牌
2019/10/18 全球购物
在数据文件自动增长时,自动增长是否会阻塞对文件的更新
2014/05/01 面试题
EJB的角色和三个对象
2015/12/31 面试题
管理部部长岗位职责
2013/12/05 职场文书
求职信格式要求
2014/05/23 职场文书
员工培训协议书
2014/09/15 职场文书
乡镇镇长个人整改措施
2014/10/01 职场文书
golang DNS服务器的简单实现操作
2021/04/30 Golang
《英雄联盟》2022日蚀、月蚀皮肤演示 黑潮亚索曝光
2022/04/13 其他游戏
阿里云ECS云服务器快照的概念以及如何使用
2022/04/21 Servers
Python爬取奶茶店数据分析哪家最好喝以及性价比
2022/09/23 Python