解析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 相关文章推荐
在textarea文本域中显示HTML代码的方法
Mar 06 Javascript
自己的js工具 Cookie 封装
Aug 21 Javascript
json-lib出现There is a cycle in the hierarchy解决办法
Feb 24 Javascript
理解Javascript_05_原型继承原理
Oct 13 Javascript
jQuery中$.ajax()和$.getJson()同步处理详解
Aug 12 Javascript
浅谈Javascript中Object与Function对象
Sep 26 Javascript
对象转换为原始值的实现方法
Jun 06 Javascript
AngularJS 中文API参考手册
Jul 28 Javascript
Base64(二进制)图片编码解析及在各种浏览器的兼容性处理
Feb 09 Javascript
vue二级路由设置方法
Feb 09 Javascript
VueJS 组件参数名命名与组件属性转化问题
Dec 03 Javascript
Vue通过getAction的finally来最大程度避免影响主数据呈现问题
Apr 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
Terran建筑一览
2020/03/14 星际争霸
PHP中Fatal error session_start()错误解决步骤
2014/08/05 PHP
JavaScript中将一个值转换为字符串的方法分析[译]
2012/09/21 Javascript
Javascript排序算法之合并排序(归并排序)的2个例子
2014/04/04 Javascript
setInterval计时器不准的问题解决方法
2014/05/08 Javascript
js实现文章文字大小字号功能完整实例
2014/11/01 Javascript
浅谈javascript面向对象程序设计
2015/01/21 Javascript
常用的JavaScript模板引擎介绍
2015/02/28 Javascript
kindeditor编辑器点中图片滚动条往上顶的bug
2015/07/05 Javascript
Jquery+ajax+JAVA(servlet)实现下拉菜单异步取值
2016/03/23 Javascript
jquery自定义插件开发之window的实现过程
2016/05/06 Javascript
Bootstrap Modal遮罩弹出层代码分享
2016/11/21 Javascript
js中数组的常用方法小结
2016/12/30 Javascript
js实现倒计时效果(小于10补零)
2017/03/08 Javascript
Angular.Js中ng-include指令的使用与实现
2017/05/07 Javascript
基于hover的用法实例(推荐)
2017/07/04 Javascript
利用js编写网页进度条效果
2017/10/08 Javascript
JS常见DOM节点操作示例【创建 ,插入,删除,复制,查找】
2018/05/14 Javascript
使用D3.js+Vue实现一个简单的柱形图
2018/08/05 Javascript
react build 后打包发布总结
2018/08/24 Javascript
分享vue里swiper的一些坑
2018/08/30 Javascript
JavaScript实现无限级递归树的示例代码
2019/03/29 Javascript
[01:01]青春无憾,一战成名——DOTA2全国高校联赛开启
2018/02/25 DOTA
Python 3.6 -win64环境安装PIL模块的教程
2019/06/20 Python
基于Python爬取51cto博客页面信息过程解析
2020/08/25 Python
CSS3 开发工具收集
2010/04/17 HTML / CSS
大学团支书的自我评价分享
2013/12/14 职场文书
图书室管理制度
2014/01/19 职场文书
《故乡》教学反思
2014/04/10 职场文书
商铺消防安全责任书
2014/07/29 职场文书
写字楼租赁意向书
2014/07/30 职场文书
2014年大学生社会实践自我鉴定
2014/09/26 职场文书
2014收银员工作总结范文
2014/12/16 职场文书
监考失职检讨书
2015/01/26 职场文书
2015年路政工作总结
2015/05/22 职场文书
JS前端轻量fabric.js系列之画布初始化
2022/08/05 Javascript