解析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中xml操作实现代码
Nov 21 Javascript
js动态创建及移除div的方法
Jun 03 Javascript
基于JS实现的倒计时程序实例
Jul 24 Javascript
使用jQuery或者原生js实现鼠标滚动加载页面新数据
Mar 06 Javascript
Vue分页组件实例代码
Apr 17 Javascript
彻底理解js面向对象之继承
Feb 04 Javascript
jQuery实现碰到边缘反弹的动画效果
Feb 24 jQuery
Angular中使用better-scroll插件的方法
Mar 27 Javascript
Vue使用vux-ui自定义表单验证遇到的问题及解决方法
May 10 Javascript
微信小程序导航栏滑动定位功能示例(实现CSS3的positionsticky效果)
Jan 24 Javascript
Node.js从字符串生成文件流的实现方法
Aug 18 Javascript
layui+SSM的数据表的增删改实例(利用弹框添加、修改)
Sep 27 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 socket 模拟POST 请求实例代码
2016/07/18 PHP
Yii核心验证器api详解
2016/11/23 PHP
php 命名空间(namespace)原理与用法实例小结
2019/11/13 PHP
使用隐藏的new来创建对象
2011/03/29 Javascript
jQuery :nth-child前有无空格的区别分析
2011/07/11 Javascript
javaScript 动态访问JSon元素示例代码
2013/08/30 Javascript
JS实现匀速运动的代码实例
2013/11/29 Javascript
一个不错的js html页面倒计时可精确到秒
2014/10/22 Javascript
javascript中callee与caller的区别分析
2015/04/20 Javascript
JavaScript的面向对象编程基础
2015/08/13 Javascript
JS设置cookie、读取cookie
2016/02/24 Javascript
原生JS实现-星级评分系统的简单实例
2016/08/21 Javascript
详解使用fetch发送post请求时的参数处理
2017/04/05 Javascript
Kindeditor单独调用单图上传增加预览功能的实例
2017/07/31 Javascript
Vue组件模板形式实现对象数组数据循环为树形结构(实例代码)
2017/07/31 Javascript
浅谈React中组件间抽象
2018/01/27 Javascript
angular2 ng2-file-upload上传示例代码
2018/08/23 Javascript
如何在vue里面优雅的解决跨域(路由冲突问题)
2019/01/20 Javascript
如何利用ES6进行Promise封装总结
2019/02/11 Javascript
Node.js 实现抢票小工具 & 短信通知提醒功能
2019/10/22 Javascript
vue 封装 Adminlte3组件的实现
2020/03/18 Javascript
利用python将xml文件解析成html文件的实现方法
2017/12/22 Python
python实现自主查询实时天气
2018/06/22 Python
Python实现合并excel表格的方法分析
2019/04/13 Python
python多任务之协程的使用详解
2019/08/26 Python
python requests.get带header
2020/05/05 Python
如何使用Python进行PDF图片识别OCR
2021/01/22 Python
中西医结合临床医学专业大学生自荐信
2013/09/28 职场文书
开展党的群众路线教育实践活动方案
2014/02/05 职场文书
12岁生日演讲稿
2014/05/14 职场文书
慈善捐赠倡议书
2014/08/30 职场文书
2014年教师批评与自我批评思想汇报
2014/09/20 职场文书
董事长秘书岗位职责
2015/02/13 职场文书
2015年环境整治工作总结
2015/05/22 职场文书
小程序wx.getUserProfile接口的具体使用
2021/06/02 Javascript
Python编写冷笑话生成器
2022/04/20 Python