JavaScript数组的高级用法-reduce和reduceRight详解
来源:互联网 发布:广州新科佳都科技 知乎 编辑:程序博客网 时间:2024/05/17 01:27
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
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
- JavaScript数组的高级用法-reduce和reduceRight详解
- JavaScript数组的高级用法-reduce和reduceRight详解
- 数组reduce()和reduceRight()方法
- JS数组reduce()和reduceRight()方法
- javascript 中的reduce方法 和 reduceRight方法
- 详解JavaScript中数组的reduce方法
- 详解JavaScript中数组的reduce方法
- JavaScript中eval()、with()和reduce()的用法
- JavaScript中eval()、with()和reduce()的用法
- 数组reduce方法的高级技巧
- 数组 reduce 方法的高级技巧
- 数组和集合的高级用法
- js中数组过滤、遍历、迭代every、some、filter、map、forEach、reduce、reduceRight
- javaScript循环总结(for,for-in,for-of,forEach,map,filter,every,reduce,reduceRight)
- JS数组的reduce()函数用法
- javaScript--数组(Array)的reduce方法解析
- Javascript数组---map(),reduce()方法的区别
- 引自JavaScript权威指南(第三版):数组的高级用法
- refind 0.10.3 配置文件refind.conf简单分析
- 魏则西事件之后,民营医疗的营销方式
- Jquery Md5加密-Jquery.md5.js
- Java之json和对象之间的相互转换
- Leetcode Restore IP Address
- JavaScript数组的高级用法-reduce和reduceRight详解
- android动画定义
- 从 ASP .NET 进行 Active Directory 域服务身份验证
- java-jni-01-Introduction
- HDU4069(未AC)
- STM32F1学习-时钟系统
- UVA - 10916 Factstone Benchmark
- HDOJ 5499 SDOI(典型的翻译题目,处理女生特殊情况的问题)
- 嵌入式c语言 之数据结构:为什么嵌入式要选择c语言? *c的可移植性好:能在不同平台的结构访问硬件 *c具有简洁紧、使用灵活的语法机制,并能直接访问硬件。 *c具有高效的运行效率