JavaScript reduce和reduceRight详解

 更新时间:2016年10月24日 10:33:51   作者:Simon_ITer  
这篇文章主要介绍了JavaScript reduce和reduceRight的高级用法详解的相关资料,需要的朋友可以参考下

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实现阿拉伯数字和中文数字互相转换

    JavaScript实现阿拉伯数字和中文数字互相转换

    JavaScript实现阿拉伯数字和中文数字互相转换可以用数组的循环检测后的替换来实现,下面主要讲解其中的一些核心算法:
    2016-06-06
  • Bootstrap基本组件学习笔记之列表组(11)

    Bootstrap基本组件学习笔记之列表组(11)

    这篇文章主要为大家详细介绍了Bootstrap基本组件学习笔记之列表组,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • JavaScript实现定时页面跳转功能示例

    JavaScript实现定时页面跳转功能示例

    这篇文章主要介绍了JavaScript实现定时页面跳转功能,涉及javascript结合时间函数定时触发自定义函数功能操作技巧,需要的朋友可以参考下
    2017-02-02
  • js实现快速分享功能(你的文章分享工具)

    js实现快速分享功能(你的文章分享工具)

    这是一款简单易用的文章分享工具,您只需将下面的html代码拷贝到模板中就可以实现文章快速分享功能,具体的实现如下,感兴趣的朋友可以参考下哈,希望对大家有所帮助
    2013-06-06
  • js实现仿阿里巴巴城市选择框效果实例

    js实现仿阿里巴巴城市选择框效果实例

    这篇文章主要介绍了js实现仿阿里巴巴城市选择框效果,实例分析了javascript结合css与数组实现城市选择框的方法,需要的朋友可以参考下
    2015-06-06
  • js获取UserControl内容为拼html时提供方便

    js获取UserControl内容为拼html时提供方便

    js获取UserControl内容时无法测试通过,原来是继承了Page 然后使用VerifyRenderingInServerForm验证
    2014-11-11
  • JS实现弹出下载对话框及常见文件类型的下载

    JS实现弹出下载对话框及常见文件类型的下载

    JS要实现下载功能,一般都是这么几个过程:生成下载的URL,动态创建一个A标签,并将其href指向生成的URL,然后触发A标签的单击事件,这样就会弹出下载对话框,从而实现了一个下载的功能
    2017-07-07
  • Javascript本地存储localStorage看这一篇就够了

    Javascript本地存储localStorage看这一篇就够了

    这篇文章主要给大家介绍了关于Javascript本地存储localStorage的相关资料,localStorage会可以将第一次请求的数据直接存储到本地,这个相当于一个5M大小的针对于前端页面的数据库,需要的朋友可以参考下
    2024-07-07
  • 一文带你了解async/await的使用

    一文带你了解async/await的使用

    async/await 让异步代码变成同步的方式,从而使代码更具表现力和可读性;还统一了异步编程的经验;以及提供了更好的错误堆栈跟踪。本文就来讲讲async/await的使用,需要的可以参考一下
    2022-09-09
  • JavaScript 函数惰性载入的实现及其优点介绍

    JavaScript 函数惰性载入的实现及其优点介绍

    惰性载入表示函数执行的分支只会在函数第一次掉用的时候执行,在第一次调用过程中,该函数会被覆盖为另一个按照合适方式执行的函数,这样任何对原函数的调用就不用再经过执行的分支了
    2013-08-08

最新评论