array.reduceRight

array.reduceRight

reduceRight() 方法接受一个函数作为累加器(accumulator)和数组的每个值(从右到左)将其减少为单个值。

var flattened = [[0, 1], [2, 3], [4, 5]].reduceRight(function(a, b) { return a.concat(b }, [] // flattened is [4, 5, 2, 3, 0, 1]

对于从左至右遍历的相似方法请参阅 Array.prototype.reduce().

语法

arr.reduceRight(callback[, initialValue])

参数

callback一个回调函数,用来操作数组中的每个元素,可接受四个参数:

返回值

执行之后的返回值

描述

reduceRight为数组中每个元素调用一次callback回调函数,但是数组中被删除的索引或从未被赋值的索引会跳过。回调函数接受四个参数:初始值(或上次调用回调的返回值)、当前元素值、当前索引,以及调用reduce的数组。

可以像下面这样调用reduceRight的回调函数 callback

array.reduceRight(function(previousValue, currentValue, index, array) { // ... }

首次调用回调函数时,previousValuecurrentValue 可以是两个值之一。如果调用reduceRight时提供了 initialValue 参数,则 previousValue 等于 initialValuecurrentValue 等于数组中的最后一个值。如果没有提供 initialValue 参数,则 previousValue等于数组最后一个值, currentValue等于数组中倒数第二个值。

如果数组为空,且没有提供 initialValue参数,将会抛出一个 TypeError 错误。如果数组只有一个元素且没有提供initialValue参数,或者提供了 initialValue参数,但是数组为空将会直接返回数组中的那一个元素或initialValue参数,而不会调用 callback

该函数的完整执行过程见下例:

[0, 1, 2, 3, 4].reduceRight(function(previousValue, currentValue, index, array) { return previousValue + currentValue; }

回调将会被调用四次,每次调用的参数及返回值如下:

callbackpreviousValuecurrentValueindexarrayreturn value
first call4330, 1, 2, 3, 47
second call7220, 1, 2, 3, 49
third call9110, 1, 2, 3, 410
fourth call10000, 1, 2, 3, 410

reduceRight返回值是最后一次调用回调的返回值(10)。

如果提供了一个 initialValue 参数,则结果如下:

[0, 1, 2, 3, 4].reduceRight(function(previousValue, currentValue, index, array) { return previousValue + currentValue; }, 10

callbackpreviousValuecurrentValueindexarrayreturn value
first call10440, 1, 2, 3, 414
second call14330, 1, 2, 3, 417
third call17220, 1, 2, 3, 419
fourth call19110, 1, 2, 3, 420
fifth call20000, 1, 2, 3, 420

reduceRight返回值为 20。

示例

求一个数组中所有值的和

var sum = [0, 1, 2, 3].reduceRight(function(a, b) { return a + b; } // sum is 6

扁平化(flatten)一个元素为数组的数组

var flattened = [[0, 1], [2, 3], [4, 5]].reduceRight(function(a, b) { return a.concat(b }, [] // flattened is [4, 5, 2, 3, 0, 1]

reduce 与 reduceRight 之间的区别

var a = ['1', '2', '3', '4', '5']; var left = a.reduce(function(prev, cur) { return prev + cur; } var right = a.reduceRight(function(prev, cur) { return prev + cur; } console.log(left // "12345" console.log(right // "54321"

Polyfill

reduceRight被添加到 ECMA-262 标准第 5 版,因此它在某些实现环境中可能不被支持。把下面的代码添加到脚本开头可以解决此问题,从而允许在那些没有原生支持reduceRight的实现环境中使用它。

// Production steps of ECMA-262, Edition 5, 15.4.4.22 // Reference: http://es5.github.io/#x15.4.4.22 if ('function' !== typeof Array.prototype.reduceRight) { Array.prototype.reduceRight = function(callback /*, initialValue*/) { 'use strict'; if (null === this || 'undefined' === typeof this) { throw new TypeError('Array.prototype.reduce called on null or undefined' } if ('function' !== typeof callback) { throw new TypeError(callback + ' is not a function' } var t = Object(this), len = t.length >>> 0, k = len - 1, value; if (arguments.length >= 2) { value = arguments[1]; } else { while (k >= 0 && !(k in t)) { k--; } if (k < 0) { throw new TypeError('Reduce of empty array with no initial value' } value = t[k--]; } for (; k >= 0; k--) { if (k in t) { value = callback(value, t[k], k, t } } return value; }; }

规范

SpecificationStatusComment
ECMAScript 5.1 (ECMA-262)The definition of 'Array.prototype.reduceRight' in that specification.StandardInitial definition. Implemented in JavaScript 1.8.
ECMAScript 2015 (6th Edition, ECMA-262)The definition of 'Array.prototype.reduceRight' in that specification.Standard
ECMAScript Latest Draft (ECMA-262)The definition of 'Array.prototype.reduceRight' in that specification.Living Standard

浏览器兼容性

FeatureChromeEdgeFirefoxInternet ExplorerOperaSafari
Basic Support(Yes)(Yes)3910.54

FeatureAndroidChrome for AndroidEdge mobileFirefox for AndroidIE mobileOpera AndroidiOS Safari
Basic Support(Yes)(Yes)(Yes)1(Yes)(Yes)(Yes)