JavaScript reduce和reduceRight详解
作者:Simon_ITer 发布时间:2024-05-02 16:19:55
reduce 方法(升序)
语法:
array1.reduce(callbackfn[, initialValue])
参数 | 定义 |
---|---|
array1 | 必需。一个数组对象。 |
callbackfn | 必需。一个接受最多四个参数的函数。对于数组中的每个元素,reduce 方法都会调用 callbackfn 函数一次。 |
initialValue | 可选。如果指定 initialValue,则它将用作初始值来启动累积。第一次调用 callbackfn 函数会将此值作为参数而非数组值提供 |
返回值:
通过最后一次调用回调函数获得的累积结果。
异常:
当满足下列任一条件时,将引发 TypeError 异常:
callbackfn 参数不是函数对象。
数组不包含元素,且未提供 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 ");
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


猜你喜欢
- 1.路径符号的含义 src="/js/jquery.js"、"../"这个斜杠是绝对路径的意思,表示
- 📚引言泰坦尼克号的沉没是历史上最惨痛的沉船事件之一。1912年4月15日,泰坦尼克号在其处女航中与冰山相撞后沉没,2224名乘客和船员中的1
- 这个concatenate用于将矩阵合并,他将沿着已经存在的轴合并一个矩阵,相关参数有(a1, a2, ...), axis=0, out=
- 目录plsql141. 安装注册使用 1.激活了会提示激活成功plsql developer14是由Allround Automa
- 本文为大家分享了mysql 5.7.16 免安装版本教程,供大家参考,具体内容如下MySQL: 5.7.16 程序目
- cli2去掉eslint检查器报错eslint在编写过程中及其严格,甚至单引号和双引号或者空格注释都会引起报错,导致项目无法正常运行因此,只
- 本文目的是创建一个MySQL的image,并且在新创建出来的容器里自动启动MySQL服务接受外部连接步骤:1. 首先创建一个目录并在目录下创
- Abs (数值)绝对值。一个数字的绝对值是它的正值。空字符串 (null) 的绝对值,也是空字符串。未初始化的变数,其绝对为 0例子:ABS
- 写在前面这篇文章推荐一个由Golang编写的一个命令行工具——Glow,这个CLI工具可以在命令行读
- 小张的Pycharm最近弹出提示框 Your license has expired提示过期....纳尼!!!!是不是看到这个也很头疼,。于
- 前言相比java,python的异常和java中不同,python主要是防止程序异常被中止。一旦被catch后它还行往下执行。一、异常1.1
- FTP一般流程FTP对应PASV和PORT两种访问方式,分别为被动和主动,是针对FTP服务器端进行区分的,正常传输过程中21号端口用于指令传
- 常用的python第三方库安装工具大概有三种:1、pip (推荐)2、easy_install3、setup.py常见的安装包格式:1、wh
- 背景索引是把 * 剑,在提升查询速度的同时会减慢DML的操作。毕竟,索引的维护需要一定的成本。所以,对于索引,要加上该加的,删除无用的。前者是
- Nagios是一款开源的免费网络监视工具,能有效监控Windows、Linux和Unix的主机状态,交换机路由器等网络设置,打印机等。在系统
- 之前在网上看过好多关于mysql.sock不见的问题,并没有关注这个东西存在的意义,直到自己的mysql也出现了相同的问题。让人纠结了一把…
- 前言 网传的七天学Python的路线如下,我觉得可以在学过此表中前几天的内容后,就可以回头来学习一下列表推导式:它综合了列表、fo
- 由于在遭遇到这个页面之前我们一 * 互刚好在讨论交互设计原则之类的话题,其中有一条是:包容性,即满足主体用户需求的同时,尽可能兼顾非主体用户需
- shelve类似于一个key-value数据库,可以很方便的用来保存Python的内存对象,其内部使用pickle来序列化数据,简单来说,使
- 最近在研究C++连接数据库的问题。安装了MySQL后,在其安装目录下的include文件夹并没有找到libmysql.lib.这个经过研究,