reduceRight方法接受一个回调函数和一个初始值(可选),将数组中的元素(从右向左)汇总为一个返回值。
语法
array.reduceRight(callback(accumnlator, currentValue[, index[, array]]) {…}[, initValue])
array:调用reduceRight方法的数组
callback:用户操作数组中每个元素的回调函数,可以接受四个参数
accumnlator:累加器,上一次调用回调函数时的返回值。首次调用回调函数时如果提供initValue,则累加器即为initValue。否则为数组中的最后一个元素
currentValue:当前被处理的元素
index:(可选)当前处理的元素的索引
array:(可选)调用reduceRight方法的数组
initValue:(可选)首次调用回调函数时,提供给accumnlator的值。如果没有提供initValue,则将使用数组中的最后一个元素并跳过该元素。如果不提供初始值,则需要保证数组不为空。否则在空数组上调用reduceRight会导致类型错误 TypeError: reduce of empty array with no initial value。
返回值:回调函数处理的结果
描述
reduceRight为数组中的每个元素调用一次回调函数,但是未赋值和已删除的元素索引会被跳过。
首次调用时,accumnlator和currentValue的取值有以下两种情况。
- 如果传入了initValue,则accumnlator的取值就位initValue,currentValue取值为数组中的最后一个元素。
- 如果没有传入initValue,则accumnlator的取值为数组中的最后一个元素,currentValue取值为数组中倒数第二个元素。
如果数组为空且传入了initValue或者数组中只有一个元素且没有传入initValue。此时会直接返回initValue或者数组中的元素。此时这两种情况下都不会调用callback回调函数。
如果数组为空,且没有传入initValue参数,此时会抛出一个TypeError错误。
此时,首次调用时的情况如下表
数组中的元素个数 | 是否提供initValue | 结果 |
---|---|---|
0 | 1:是 2:否 | 1:直接返回initValue参数 2:抛出TypeError错误 |
1 | 1:是 2:否 | 1:accumnlator为initValue参数,currentValue为数组中的元素 2:直接返回数组中的元素 |
>1 | 1:是 2:否 | 1:accumnlator为initValue参数,currentValue为数组中的最后一个元素 2:accumnlator为数组中最后一个元素,currentValue为数组中倒数第二个元素 |
改函数的完整执行过程如下
// 未传入initValue
[0, 2, 4, 6, 8].reduceRight(function(accumnlator, currentValue, index, array) {
return accumnlator + currentValue;
})
callback | accumnlator | currentValue | index | array | 返回值 |
---|---|---|---|---|---|
第一次调用 | 8 | 6 | 3 | [0, 2, 4, 6, 8] | 14 |
第二次调用 | 14 | 4 | 2 | [0, 2, 4, 6, 8] | 18 |
第三次调用 | 18 | 2 | 1 | [0, 2, 4, 6, 8] | 20 |
第四次调用 | 20 | 0 | 0 | [0, 2, 4, 6, 8] | 20 |
返回值是最后一次调用reduceRight的值(20)
// 传入initValue
[0, 2, 4, 6, 8].reduceRight(function(accumnlator, currentValue, index, array) {
return accumnlator + currentValue
}, 10)
callback | accumnlator | currentValue | index | array | 返回值 |
---|---|---|---|---|---|
第一次调用 | 10 | 8 | 4 | [0, 2, 4, 6, 8] | 18 |
第二次调用 | 18 | 6 | 3 | [0, 2, 4, 6, 8] | 24 |
第三次调用 | 24 | 4 | 2 | [0, 2, 4, 6, 8] | 28 |
第四次调用 | 28 | 2 | 1 | [0, 2, 4, 6, 8] | 30 |
第五次调用 | 30 | 0 | 0 | [0, 2, 4, 6, 8] | 30 |
返回值是最后一次调用reduceRight的值(30)
示例
1 求一个数组中所有元素的和
const sums = [0, 1, 2, 3, 4].reduceRight((acc, cur) => acc + cur);
// sums 10
2 扁平化一个数组
const flatArr = [[0, 1], [2, 3], [4, 5]].reduceRight(function(acc, cur) {
return acc.concat(cur)
}, [])
// flatArr [4, 5, 2, 3, 0, 1]