JavaScript reduce和reduceRight详解
reduce方法(升序)
语法:
array1.reduce(callbackfn[,initialValue])
参数 |
定义 |
---|---|
array1 |
必需。一个数组对象。 |
callbackfn |
必需。一个接受最多四个参数的函数。对于数组中的每个元素,reduce 方法都会调用 callbackfn 函数一次。 |
initialValue |
可选。如果指定 initialValue,则它将用作初始值来启动累积。第一次调用 callbackfn 函数会将此值作为参数而非数组值提供 |
返回值:
通过最后一次调用回调函数获得的累积结果。
异常:
当满足下列任一条件时,将引发TypeError异常:
- callbackfn参数不是函数对象。
- 数组不包含元素,且未提供initialValue。
回调函数语法:
functioncallbackfn(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参数。
functionappendCurrent(previousValue,currentValue){ returnpreviousValue+"::"+currentValue; } varelements=["abc","def",123,456]; varresult=elements.reduce(appendCurrent); document.write(result); //Output: //abc::def::123::456
2.下面的示例向数组添加舍入后的值。使用初始值0调用reduce方法。
functionaddRounded(previousValue,currentValue){ returnpreviousValue+Math.round(currentValue); } varnumbers=[10.9,15.4,0.5]; varresult=numbers.reduce(addRounded,0); document.write(result); //Output:27
3.下面的示例向数组中添加值。currentIndex和array1参数用于回调函数
functionaddDigitValue(previousValue,currentDigit,currentIndex,array){ varexponent=(array.length-1)-currentIndex; vardigitValue=currentDigit*Math.pow(10,exponent); returnpreviousValue+digitValue; } vardigits=[4,1,2,5]; varresult=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方法的初始值是一个空数组。
functionProcess2(previousArray,currentValue){ varnextArray; if(currentValue>=1&¤tValue<=10) nextArray=previousArray.concat(currentValue); else nextArray=previousArray; returnnextArray; } varnumbers=[20,1,-5,6,50,3]; varemptyArray=newArray(); varresultArray=numbers.reduceRight(Process2,emptyArray); document.write("resultarray="+resultArray); //Output: //resultarray=3,6,1
2.reduceRight方法可应用于字符串。下面的示例演示如何使用此方法反转字符串中的字符。
functionAppendToArray(previousValue,currentValue){ returnpreviousValue+currentValue; } varword="retupmoc"; varresult=[].reduceRight.call(word,AppendToArray,"the"); //varresult=Array.prototype.reduceRight.call(word,AppendToArray,"the"); document.write(result); //Output: //thecomputer
这里可以直接使用空数组调用reduceRight方法,并且使用call方法将参数引入。也可以是直接使用原型链的方式进行调用,即Array.prototype.reduceRight.call(word,AppendToArray,"the");
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!