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 相关文章推荐
js取模(求余数)隔行变色
May 15 Javascript
JS实现slide文字框缩放伸展效果代码
Nov 05 Javascript
最佳的JavaScript错误处理实践
Jul 16 Javascript
微信小程序 wxapp内容组件 icon详细介绍
Oct 31 Javascript
从零学习node.js之利用express搭建简易论坛(七)
Feb 25 Javascript
jQuery给表格添加分页效果
Mar 02 Javascript
详解Node.js access_token的获取、存储及更新
Jun 20 Javascript
详解Vue 事件修饰符capture 的使用
Dec 29 Javascript
JS简单获得节点元素的方法示例
Feb 10 Javascript
webpack4的迁移的使用方法
May 25 Javascript
基于Vue实现平滑过渡的拖拽排序功能
Jun 12 Javascript
Vue按时间段查询数据组件使用详解
Aug 21 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
Zend的MVC机制使用分析(一)
2013/05/02 PHP
ThinkPHP3.1新特性之对页面压缩输出的支持
2014/06/19 PHP
jQuery下扩展插件和拓展函数的写法(匿名函数使用的典型例子)
2010/10/20 Javascript
基于jquery的自定义鼠标提示效果 jquery.toolTip
2010/11/14 Javascript
Jquery中Ajax 缓存带来的影响的解决方法
2011/05/19 Javascript
jquery.ui.draggable中文文档(原文翻译)
2013/11/15 Javascript
jQuery验证插件validation使用指南
2015/04/21 Javascript
JQuery通过AJAX从后台获取信息显示在表格上并支持行选中
2015/09/15 Javascript
jQuery新窗口打开外链接
2016/07/21 Javascript
angularjs 源码解析之injector
2016/08/22 Javascript
Javascript动画效果(3)
2016/10/11 Javascript
vue webuploader 文件上传组件开发
2017/09/23 Javascript
详解react-router 4.0 下服务器如何配合BrowserRouter
2017/12/29 Javascript
vue实现添加与删除图书功能
2018/10/07 Javascript
Vue中的作用域CSS和CSS模块的区别
2018/10/09 Javascript
JS实现十分钟倒计时代码实例
2018/10/18 Javascript
详解如何解决vue开发请求数据跨域的问题(基于浏览器的配置解决)
2018/11/12 Javascript
Vue-input框checkbox强制刷新问题
2019/04/18 Javascript
详解Vue中组件的缓存
2019/04/20 Javascript
js使用文件流下载csv文件的实现方法
2019/07/15 Javascript
[02:16]DOTA2超级联赛专访Burning 逆袭需要抓住机会
2013/06/24 DOTA
[02:36]DOTA2英雄基础教程 一击致命幻影刺客
2013/12/06 DOTA
使用Python读写及压缩和解压缩文件的示例
2016/07/08 Python
如何安装多版本python python2和python3共存以及pip共存
2018/09/18 Python
python爬虫开发之PyQuery模块详细使用方法与实例全解
2020/03/09 Python
基于python+selenium自动健康打卡的实现代码
2021/01/13 Python
纯CSS3实现的8种Loading动画效果
2014/07/05 HTML / CSS
Html5 webRTC简单实现视频调用的示例代码
2020/09/23 HTML / CSS
欧洲最大的婴幼儿服装及内衣公司:Petit Bateau(小帆船)
2016/08/16 全球购物
一套PHP的笔试题
2013/05/31 面试题
Ruby如何创建一个线程
2013/03/10 面试题
低碳环保标语
2014/06/12 职场文书
优秀学生干部事迹材料
2014/12/24 职场文书
罚站检讨书
2015/01/29 职场文书
三傻大闹宝莱坞观后感
2015/06/03 职场文书
Sentry的安装、配置、使用教程(Sentry日志手机系统)
2022/07/23 Python