解析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 浏览器检测代码精简版
Mar 04 Javascript
调用innerHTML之后onclick失效问题的解决方法
Jan 28 Javascript
jQuery选择器全集详解
Nov 24 Javascript
使用JavaScript+canvas实现图片裁剪
Jan 30 Javascript
jquery操作复选框checkbox的方法汇总
Feb 05 Javascript
javascript实现简单加载随机色方块
Dec 25 Javascript
jQuery Timelinr实现垂直水平时间轴插件(附源码下载)
Feb 16 Javascript
基于HTML5+JS实现本地图片裁剪并上传功能
Mar 24 Javascript
纯js实现页面返回顶部的动画(超简单)
Aug 10 Javascript
javascript高级模块化require.js的具体使用方法
Oct 31 Javascript
vue实现在一个方法执行完后执行另一个方法的示例
Aug 25 Javascript
Webpack中SplitChunksPlugin 配置参数详解
Mar 24 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
Flash空降上海 化身大魔王接受挑战
2020/03/02 星际争霸
php getsiteurl()函数
2009/09/05 PHP
Android ProgressBar进度条和ProgressDialog进度框的展示DEMO
2013/06/19 PHP
基于PHP实现发微博动态代码实例
2020/12/11 PHP
javascript简单实现表格行间隔显示颜色并高亮显示
2013/11/29 Javascript
javascript学习笔记(二)数组和对象部分
2014/09/30 Javascript
javascript实现依次输入input自动定焦
2014/12/23 Javascript
js显示当前日期时间和星期几
2015/10/22 Javascript
Jquery ajax基础教程
2015/11/20 Javascript
第一章之初识Bootstrap
2016/04/25 Javascript
JS制作适用于手机和电脑的通知信息效果
2016/10/28 Javascript
在Vue中使用Compass的方法
2018/03/02 Javascript
vue实现城市列表选择功能
2018/07/16 Javascript
详解处理bootstrap4不支持远程静态框问题
2018/07/20 Javascript
原生js实现移动端Touch轮播图的方法步骤
2019/01/03 Javascript
微信小程序开发实现的IP地址查询功能示例
2019/03/28 Javascript
一文读懂ES7中的javascript修饰器
2019/05/06 Javascript
vue data引入本地图片的两种方式小结
2019/11/13 Javascript
javascript自定义加载loading效果
2020/09/15 Javascript
Python基于贪心算法解决背包问题示例
2017/11/27 Python
Python GUI Tkinter简单实现个性签名设计
2018/06/19 Python
Python Dataframe 指定多列去重、求差集的方法
2018/07/10 Python
利用django-suit模板添加自定义的菜单、页面及设置访问权限
2018/07/13 Python
Python多进程fork()函数详解
2019/02/22 Python
使用python绘制二维图形示例
2019/11/22 Python
python如何使用Redis构建分布式锁
2020/01/16 Python
python实现滑雪游戏
2020/02/22 Python
实例教程 HTML5 Canvas 超炫酷烟花绽放动画实现代码
2014/11/05 HTML / CSS
Levi’s美国官网:美国著名的牛仔裤品牌
2016/08/19 全球购物
简历上的自我评价
2014/02/03 职场文书
《数星星的孩子》教学反思
2014/04/11 职场文书
幼儿园迎国庆65周年活动策划方案
2014/09/16 职场文书
运动会广播稿20字
2015/08/19 职场文书
小学英语教学反思范文
2016/02/15 职场文书
2019年图书室自查报告范本
2019/10/12 职场文书
vue ant design 封装弹窗表单的使用
2022/06/01 Vue.js