解析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:sugggestion.js
Sep 02 Javascript
jquery获取tagName再进行判断
May 29 Javascript
JS判断当前页面是否在微信浏览器打开的方法
Dec 08 Javascript
基于javascript实现随机颜色变化效果
Jan 14 Javascript
jquery trigger函数执行两次的解决方法
Feb 29 Javascript
JavaScript数组去重的两种方法推荐
Apr 05 Javascript
jquery.serialize() 函数语法及简单实例
Jul 08 Javascript
JS扩展类,克隆对象与混合类实例分析
Nov 26 Javascript
jQuery鼠标移动图片上实现放大效果
Jun 25 jQuery
ReactNative 之FlatList使用及踩坑封装总结
Nov 29 Javascript
Vue项目数据动态过滤实践及实现思路
Sep 11 Javascript
JS简易计算器实例讲解
Jun 30 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(三)
2012/03/22 PHP
php循环语句 for()与foreach()用法区别介绍
2012/09/05 PHP
discuz加密解密函数使用方法和中文注释
2014/01/21 PHP
PHP实现格式化文件数据大小显示的方法
2015/01/03 PHP
PHP实现上传文件并存进数据库的方法
2015/07/16 PHP
laravel 5.4 + vue + vux + element的环境搭配过程介绍
2018/04/26 PHP
PHP+redis实现的悲观锁机制示例
2018/06/12 PHP
laravel5.2表单验证,并显示错误信息的实例
2019/09/29 PHP
yii框架结合charjs实现统计30天数据的方法
2020/04/04 PHP
《JavaScript高级程序设计》阅读笔记(三) ECMAScript中的引用类型
2012/02/27 Javascript
使用js实现关闭js弹出层的窗口
2014/02/10 Javascript
jQuery+ajax实现鼠标单击修改内容的方法
2014/06/27 Javascript
Jquery插件之Fancybox丰富的弹出层效果附源码下载
2015/12/02 Javascript
js制作网站首页图片轮播特效代码
2016/08/30 Javascript
微信小程序 页面跳转和数据传递实例详解
2017/01/19 Javascript
vscode下vue项目中eslint的使用方法
2019/01/13 Javascript
jQuery实时统计输入框字数及限制
2020/06/24 jQuery
Vue3.0的优化总结
2020/10/16 Javascript
用Python的urllib库提交WEB表单
2009/02/24 Python
Python编写电话薄实现增删改查功能
2016/05/07 Python
Python实现多态、协议和鸭子类型的代码详解
2019/05/05 Python
python+openCV调用摄像头拍摄和处理图片的实现
2019/08/06 Python
Python帮你微信头像任意添加装饰别再@微信官方了
2019/09/25 Python
python——全排列数的生成方式
2020/02/26 Python
Python 串口通信的实现
2020/09/29 Python
Python中全局变量和局部变量的理解与区别
2021/02/07 Python
Opencv 图片的OCR识别的实战示例
2021/03/02 Python
纯CSS3实现Material Design效果
2017/03/09 HTML / CSS
纯CSS实现右侧底部悬浮效果(悬浮QQ、微信、微博、邮箱等联系方式)
2015/04/24 HTML / CSS
世界上最大的乐谱选择:Sheet Music Plus
2020/01/18 全球购物
学生处主任岗位职责
2013/12/01 职场文书
房屋租赁协议书范本
2014/04/10 职场文书
先进个人事迹材料
2014/12/29 职场文书
nginx配置ssl实现https的方法示例
2021/03/31 Servers
Django+Celery实现定时任务的示例
2021/06/23 Python
MySQL 条件查询的常用操作
2022/04/28 MySQL