解析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 相关文章推荐
JavaScript的漂亮的代码片段
Jun 05 Javascript
从数据结构的角度分析 for each in 比 for in 快的多
Jul 07 Javascript
DOM基础教程之使用DOM
Jan 19 Javascript
Vue表单实例代码
Sep 05 Javascript
AngularJS 单元测试(二)详解
Sep 21 Javascript
require、backbone等重构手机图片查看器
Nov 17 Javascript
基于wordpress的ajax写法详解
Jan 02 Javascript
Angular实现搜索框及价格上下限功能
Jan 19 Javascript
抖音上用记事本编写爱心小程序教程
Apr 17 Javascript
js实现网页版贪吃蛇游戏
Feb 22 Javascript
Javascript中window.name属性详解
Nov 19 Javascript
JavaScript文档对象模型DOM
Nov 20 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事务回滚简单实现方法示例
2017/03/28 PHP
yii 框架实现按天,月,年,自定义时间段统计数据的方法分析
2020/04/04 PHP
深入聊聊Array的sort方法的使用技巧.详细点评protype.js中的sortBy方法
2007/04/12 Javascript
javascript开发技术大全-第3章 js数据类型
2011/07/03 Javascript
JavaScript函数作用域链分析
2015/02/13 Javascript
JavaScript实现将数组中所有元素连接成一个字符串的方法
2015/04/06 Javascript
使用Raygun来自动追踪AngularJS中的异常
2015/06/23 Javascript
ExtJs动态生成treepanel的Json格式
2015/07/19 Javascript
微信小程序 网络请求(post请求,get请求)
2017/01/17 Javascript
jQuery插件FusionCharts实现的MSBar3D图效果示例【附demo源码】
2017/03/23 jQuery
基于 webpack2 实现的多入口项目脚手架详解
2017/06/26 Javascript
小程序云开发之用户注册登录
2019/05/18 Javascript
微信小程序实现下拉框功能
2019/07/16 Javascript
vue使用codemirror的两种用法
2019/08/27 Javascript
vue 实现移动端键盘搜索事件监听
2019/11/06 Javascript
[50:28]LGD女子学院第三期 DOTA2复仇之魂教学
2013/12/24 DOTA
python 实现插入排序算法
2012/06/05 Python
Python sys.argv用法实例
2015/05/28 Python
python实现的守护进程(Daemon)用法实例
2015/06/02 Python
解决pandas中读取中文名称的csv文件报错的问题
2018/07/04 Python
在python中利用KNN实现对iris进行分类的方法
2018/12/11 Python
使用celery执行Django串行异步任务的方法步骤
2019/06/06 Python
python ChainMap的使用和说明详解
2019/06/11 Python
python实现WebSocket服务端过程解析
2019/10/18 Python
python 字典访问的三种方法小结
2019/12/05 Python
python如何随机生成高强度密码
2020/08/19 Python
魔声耳机官方网站:Monster是世界第一品牌的高性能耳机
2016/10/26 全球购物
Mansur Gavriel官网:纽约市的一个设计品牌
2019/05/02 全球购物
电子商务应届生求职信
2013/11/16 职场文书
雷锋精神演讲稿
2014/05/13 职场文书
欢迎领导检查标语
2014/06/27 职场文书
PHP中->和=>的意思
2021/03/31 PHP
如何用JavaScript检测当前浏览器是无头浏览器
2021/04/27 Javascript
2021年国漫热度排行前十,完美世界上榜,第四是美国动画作品
2022/03/18 国漫
Pytorch中expand()的使用(扩展某个维度)
2022/07/15 Python
uniapp引入支付宝原生扫码插件步骤详解
2022/07/23 Javascript