JavaScript reduce和reduceRight详解

reduce 方法(升序)

语法:

参数

定义

array1

必需。一个数组对象。

callbackfn

必需。一个接受最多四个参数的函数。对于数组中的每个元素,reduce方法都会调用callbackfn函数一次。

initialValue

可选。如果指定initialValue,则它将用作初始值来启动累积。第一次调用callbackfn函数会将此值作为参数而非数组值提供

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

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

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

回调函数语法:

IoUsValue,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 参数。

rush:java;"> 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 方法

rush:js;"> 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 参数用于回调函数

rush:js;"> function addDigitValue(prevIoUsValue,currentDigit,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,array)、(4,array)、(1,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 方法的初始值是一个空数组。

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

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


什么是深拷贝与浅拷贝?深拷贝与浅拷贝是js中处理对象或数据复制操作的两种方式。‌在聊深浅拷贝之前咱得了解一下js中的两种数据类型:
前言 今天复习了一些前端算法题,写到一两道比较有意思的题:重建二叉树、反向输出链表每个节点 题目 重建二叉树: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列 {1,2,4,7,3,5,6,8} 和中序遍历序列 {
最近在看回JavaScript的面试题,this 指向问题是入坑前端必须了解的知识点,现在迎来了ES6+的时代,因为箭头函数的出现,所以感觉有必要对 this 问题梳理一下,所以刚好总结一下JavaScript中this指向的问题。
js如何实现弹出form提交表单?(图文+视频)
js怎么获取复选框选中的值
js如何实现倒计时跳转页面
如何用js控制图片放大缩小
JS怎么获取当前时间戳
JS如何判断对象是否为数组
JS怎么获取图片当前宽高
JS对象如何转为json格式字符串
JS怎么获取图片原始宽高
怎么在click事件中调用多个js函数
js如何往数组中添加新元素
js如何拆分字符串
JS怎么对数组内元素进行求和
JS如何判断屏幕大小
js怎么解析json数据
js如何实时获取浏览器窗口大小
原生JS实现别踩白块小游戏(五)