解析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之卸载鼠标事件的代码
May 14 Javascript
location.href 在IE6中不跳转的解决方法与推荐使用代码
Jul 08 Javascript
jQuery拖动图片删除示例
May 10 Javascript
jquery parent和parents的区别分析
Oct 02 Javascript
window.onload追加函数使用示例
Mar 03 Javascript
jQuery实现默认是闭合的FAQ展开效果菜单
Sep 14 Javascript
JS事件添加和移出的兼容写法示例
Jun 20 Javascript
Bootstrap源码解读标签、徽章、缩略图和警示框(8)
Dec 26 Javascript
详解html-webpack-plugin用法全解
Jan 22 Javascript
详解React之key的使用和实践
Sep 29 Javascript
微信小程序实现时间进度条功能
Nov 17 Javascript
Vue组件生命周期运行原理解析
Nov 25 Vue.js
实例分析浏览器中“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中=赋值操作符对不同数据类型的不同行为
2011/01/02 PHP
kohana框架上传文件验证规则写法示例
2014/07/14 PHP
php从memcache读取数据再批量写入mysql的方法
2014/12/29 PHP
js中匿名函数的N种写法
2010/09/08 Javascript
改变文件域的样式实现思路同时兼容ie、firefox
2013/10/23 Javascript
JS记录用户登录次数实现代码
2014/01/15 Javascript
Javascript常用字符串判断函数代码分享
2014/12/08 Javascript
浅谈JavaScript中setInterval和setTimeout的使用问题
2015/08/01 Javascript
JS中微信小程序自定义底部弹出框
2016/12/22 Javascript
利用npm 安装删除模块的方法
2018/05/15 Javascript
Javascript读写cookie的实例源码
2019/03/16 Javascript
微信小程序的tab选项卡的实现效果
2019/05/15 Javascript
ES6 Map结构的应用实例分析
2019/06/26 Javascript
微信小程序实现pdf、word等格式文件上传的方法
2019/09/10 Javascript
vue-路由精讲 二级路由和三级路由的作用
2020/08/06 Javascript
JavaScript实现简单动态表格
2020/12/02 Javascript
jQuery实现动态向上滚动
2020/12/21 jQuery
JavaScript点击按钮生成4位随机验证码
2021/01/28 Javascript
[57:22]2018DOTA2亚洲邀请赛 4.7总决赛 LGD vs Mineski 第五场
2018/04/10 DOTA
[43:43]完美世界DOTA2联赛PWL S2 FTD.C vs Rebirth 第一场 11.22
2020/11/24 DOTA
python使用ctypes模块调用windowsapi获取系统版本示例
2014/04/17 Python
Python psutil模块简单使用实例
2015/04/28 Python
python获取文件扩展名的方法
2015/07/06 Python
TensorFlow高效读取数据的方法示例
2018/02/06 Python
Python flask框架端口失效解决方案
2020/06/04 Python
Python基于Serializer实现字段验证及序列化
2020/11/04 Python
CSS3 2D模拟实现摩天轮旋转效果
2016/11/16 HTML / CSS
Dower & Hall官网:英国小众轻奢珠宝品牌
2019/01/31 全球购物
蒂娜商店:Tiina the Store
2019/12/07 全球购物
高级3D打印市场:Gambody
2019/12/26 全球购物
产品销售员岗位职责
2013/12/18 职场文书
员工考核管理制度
2014/02/02 职场文书
精彩广告词大全
2014/03/19 职场文书
低碳日宣传活动总结
2014/07/09 职场文书
天猫活动策划方案
2014/08/21 职场文书
MySQL 逻辑备份与恢复测试的相关总结
2021/05/14 MySQL