JavaScript reduce和reduceRight详解


Posted in Javascript onOctober 24, 2016

reduce 方法(升序)

语法:  

array1.reduce(callbackfn[, initialValue])

参数 定义
array1 必需。一个数组对象。
callbackfn 必需。一个接受最多四个参数的函数。对于数组中的每个元素,reduce 方法都会调用 callbackfn 函数一次。
initialValue 可选。如果指定 initialValue,则它将用作初始值来启动累积。第一次调用 callbackfn 函数会将此值作为参数而非数组值提供

返回值:

        通过最后一次调用回调函数获得的累积结果。

异常:

        当满足下列任一条件时,将引发 TypeError 异常:

  1. callbackfn 参数不是函数对象。
  2. 数组不包含元素,且未提供 initialValue。

回调函数语法:

    function callbackfn(previousValue, currentValue, currentIndex, array1)

    可使用最多四个参数来声明回调函数。

    下表列出了回调函数参数。

回调参数 定义
previousValue 通过上一次调用回调函数获得的值。如果向 reduce 方法提供 initialValue,则在首次调用函数时,previousValue 为 initialValue。
currentValue 当前数组元素的值。
currentIndex 当前数组元素的数字索引。
array1 包含该元素的数组对象。

第一次调用回调函数

在第一次调用回调函数时,作为参数提供的值取决于 reduce 方法是否具有 initialValue 参数。

如果向 reduce 方法提供 initialValue:

previousValue 参数为 initialValue。
currentValue 参数是数组中的第一个元素的值。

如果未提供 initialValue:

previousValue 参数是数组中的第一个元素的值。
currentValue 参数是数组中的第二个元素的值。

修改数组对象

数组对象可由回调函数修改。

下表描述了在 reduce 方法启动后修改数组对象所获得的结果。

reduce 方法启动后的条件 元素是否传递给回调函数
在数组的原始长度之外添加元素。 否。
添加元素以填充数组中缺少的元素。 是,如果该索引尚未传递给回调函数。
元素被更改。 是,如果该元素尚未传递给回调函数。
从数组中删除元素。 否,除非该元素已传递给回调函数。

实例:

1.下面的示例将数组值连接成字符串,各个值用“::”分隔开。由于未向 reduce 方法提供初始值,第一次调用回调函数时会将“abc”作为 previousValue 参数并将“def”作为 currentValue 参数。

function appendCurrent (previousValue, currentValue) {
 return previousValue + "::" + currentValue;
 }
var elements = ["abc", "def", 123, 456];
var result = elements.reduce(appendCurrent);
document.write(result);
// Output:
// abc::def::123::456

2.下面的示例向数组添加舍入后的值。使用初始值 0 调用 reduce 方法。

function addRounded (previousValue, currentValue) {
 return previousValue + Math.round(currentValue);
 }
var numbers = [10.9, 15.4, 0.5];
var result = numbers.reduce(addRounded, 0);
document.write (result);
// Output: 27

3.下面的示例向数组中添加值。 currentIndex 和 array1 参数用于回调函数

function addDigitValue(previousValue, currentDigit, currentIndex, array) {
 var exponent = (array.length - 1) - currentIndex;
 var digitValue = currentDigit * Math.pow(10, exponent);
 return previousValue + digitValue;
 }
var digits = [4, 1, 2, 5];
var result = digits.reduce(addDigitValue, 0);
document.write (result);
// Output: 4125

此题分析:

    首先赋予了初始值0,那么currentDigit就是从4开始的,调用方法四次,这样可以把四次方法调用的参数都写出来:(0,4,0,array)、(4,1,1,array)、(1,2,2,array)、(2,5,3,array),再一次进行计算,由于初始值是0,所有只需要计算出每个方法的返回值最后相加即可。array.length始终为4,则四次计算的值分别为4000+100+20+5=4125

reduceRight 方法(降序)

reduceRight的语法以及回调函数的规则和reduce方法是一样的,区别就是在与reduce是升序,即角标从0开始,而reduceRight是降序,即角标从arr.length-1开始。如果有初始值,则从最后一个数开始计算,如果没有初始值,则previousValue参数是数组中最后一个元素的值,currentValue是数组中倒数第二个元素的值。

示例:

1.下面的示例获取数组中值为 1 到 10 之间的元素。提供给 reduceRight 方法的初始值是一个空数组。

function Process2(previousArray, currentValue) {
 var nextArray;
 if (currentValue >= 1 && currentValue <= 10)
  nextArray = previousArray.concat(currentValue);
 else
  nextArray = previousArray;
 return nextArray;
}
var numbers = [20, 1, -5, 6, 50, 3];
var emptyArray = new Array();
var resultArray = numbers.reduceRight(Process2, emptyArray);
document.write("result array=" + resultArray);
// Output:
// result array=3,6,1

2.reduceRight 方法可应用于字符串。下面的示例演示如何使用此方法反转字符串中的字符。

function AppendToArray(previousValue, currentValue) {
 return previousValue + currentValue;
}
var word = "retupmoc";
var result = [].reduceRight.call(word, AppendToArray, "the ");
// var result = Array.prototype.reduceRight.call(word, AppendToArray, "the ");
document.write(result);
// Output:
// the computer

这里可以直接使用空数组调用reduceRight方法,并且使用call方法将参数引入。也可以是直接使用原型链的方式进行调用,即Array.prototype.reduceRight.call(word, AppendToArray, "the ");

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
找到了一篇jQuery与Prototype并存的冲突的解决方法
Aug 29 Javascript
客户端js判断文件类型和文件大小即限制上传大小
Nov 20 Javascript
js类型转换与引用类型详解(Boolean_Number_String)
Mar 07 Javascript
js实现点击链接后延迟3秒再跳转的方法
Jun 05 Javascript
基于JavaScript实现 网页切出 网站title变化代码
Apr 03 Javascript
前端开发必知的15个jQuery小技巧
Jan 22 Javascript
微信小程序实现倒计时60s获取验证码
Apr 17 Javascript
BootStrap实现文件上传并带有进度条效果
Sep 11 Javascript
基于es6三点运算符的使用方法(实例讲解)
Oct 12 Javascript
JQuery特殊效果和链式调用操作示例
May 13 jQuery
详解JavaScript中new操作符的解析和实现
Sep 04 Javascript
Vue+Java+Base64实现条码解析的示例
Sep 23 Javascript
js在ie下打开对话窗口的方法小结
Oct 24 #Javascript
浅谈AngularJs指令之scope属性详解
Oct 24 #Javascript
html、css和jquery相结合实现简单的进度条效果实例代码
Oct 24 #Javascript
PHP捕捉异常中断的方法
Oct 24 #Javascript
angularJs关于指令的一些冷门属性详解
Oct 24 #Javascript
浅谈Angular中ngModel的$render
Oct 24 #Javascript
Javascript vue.js表格分页,ajax异步加载数据
Oct 24 #Javascript
You might like
wiki-shan写的php在线加密的解密程序
2008/09/07 PHP
推荐几款用 Sublime Text 开发 Laravel 所用到的插件
2014/10/30 PHP
PHP实现的激活用户注册验证邮箱功能示例
2017/06/06 PHP
学习ExtJS TextField常用方法
2009/10/07 Javascript
常用Extjs工具:Extjs.util.Format使用方法
2012/03/22 Javascript
Java 正则表达式学习总结和一些小例子
2012/09/13 Javascript
jquery图片不完全按比例自动缩小的简单代码
2013/07/29 Javascript
JSF中confirm弹出框的用法示例介绍
2014/01/07 Javascript
理运用命名空间让js不产生冲突避免全局变量的泛滥
2014/06/15 Javascript
JavaScript判断前缀、后缀是否是空格的方法
2015/04/15 Javascript
JavaScript基本语法学习教程
2016/01/14 Javascript
js提交form表单,并传递参数的实现方法
2016/05/25 Javascript
基于iscroll.js实现下拉刷新和上拉加载效果
2016/11/28 Javascript
详解JavaScript数组过滤相同元素的5种方法
2017/05/23 Javascript
mescroll.js上拉加载下拉刷新组件使用详解
2017/11/13 Javascript
js实现鼠标拖拽缩放div实例代码
2019/03/25 Javascript
jquery获取并修改触发事件的DOM元素示例【基于target 属性】
2019/10/10 jQuery
Vue + Element-ui的下拉框el-select获取额外参数详解
2020/08/14 Javascript
[03:58]兄弟们,回来开黑了!DOTA2昔日战友招募宣传视频
2016/07/17 DOTA
python基础教程之类class定义使用方法
2014/02/20 Python
Django在Win7下的安装及创建项目hello word简明教程
2014/07/14 Python
Python实现Const详解
2015/01/27 Python
Python 读写文件和file对象的方法(推荐)
2016/09/12 Python
Python如何为图片添加水印
2016/11/25 Python
python3使用smtplib实现发送邮件功能
2018/05/22 Python
在pyqt5中QLineEdit里面的内容回车发送的实例
2019/06/21 Python
Pytorch上下采样函数--interpolate用法
2020/07/07 Python
Python 解析xml文件的示例
2020/09/29 Python
如何开启linux的ssh服务
2015/02/14 面试题
广告学专业应届生求职信
2013/10/01 职场文书
服装行业创业计划书范文
2014/02/05 职场文书
民事诉讼代理授权委托书
2014/10/11 职场文书
党员教师群众路线思想汇报范文
2014/10/28 职场文书
2015年艾滋病宣传活动总结
2015/03/27 职场文书
2016大学生入党积极分子心得体会
2016/01/06 职场文书
校园文化艺术节开幕词
2016/03/04 职场文书