El mètode reduce()
aplica una funció sobre un acumulador i cada valor de l'array (de esquerra a dreta) perr a reduir-lo a un sol valor.
sintaxi
arr.reduce(callback[, valorInicial])
Parameters
callback
- Funció a executar per a cada valor de l'array. Rep quatre arguments:
valorPrevi
- El valor retornat prèviament en l'última invocació de la funció
callback
, o bévalorInicial
, si s'ha proporcionat (vegeu més abaix). valorActual
- L'element essent processat actualment a l'array.
index
- La posició de l'element essent processat actualment a l'array.
array
- L'array al qual s'ha cridat el mètode
reduce
.
valorInicial
- Opcional. Valor a utilitzar com a primer argument a la primera crida de la funció
callback
.
Descripció
reduce
executa la funció callback
un cop per cada element present a l'array, excloent forats a l'array, i rep quatre arguments:
valorPrevi
valorActual
index
array
El primer cop que es crida callback
, valorAnterior
i valorActual
reben el valor de la forma descrita a continuació. Si es proporciona valorInicial
a la crida de reduce
, valorAnterior
rebrà el valor de valorInicial
i valorActual
serà igual al primer valor de l'array. Si no es proporciona valorInicial
, valorAnterior
serà igual al primer valor de l'array i valorActual
serà igual al segon.
Si l'array és buit i no s'ha proporcionat valorInicial
, es llençarà TypeError
. Si l'array només té un element (sense importar la seva posició) i no s'ha proporcionat valorInicial
, o si valorInicial
s'ha proporcionat però l'array és buit, es retornarà aquest únic valor sense realitzar cap crida a callback
.
Suposem que s'ha utilitzar reduce
de la forma següent:
[0, 1, 2, 3, 4].reduce(function(previousValue, currentValue, index, array) { return previousValue + currentValue; });
La funció callback
es cridarà quatre cops, on els arguments i els valors a retornar es mostren a continuació:
valorAnterior |
valorActual |
index |
array |
valor retornat | |
---|---|---|---|---|---|
primera crida | 0 |
1 |
1 |
[0, 1, 2, 3, 4] |
1 |
segons crida | 1 |
2 |
2 |
[0, 1, 2, 3, 4] |
3 |
tercera crida | 3 |
3 |
3 |
[0, 1, 2, 3, 4] |
6 |
quarta crida | 6 |
4 |
4 |
[0, 1, 2, 3, 4] |
10 |
El valor retornat per reduce
serà el de l'última invocació a callback
(10
).
Si es proporcionés el valor inicial com a segon argument de reduce
, el resultat seria el següent:
[0, 1, 2, 3, 4].reduce(function(valorAnterior, valorActual, index, array) { return valorAnterior + valorActual; }, 10);
valorAnterior |
valorActual |
index |
array |
valor retornat | |
---|---|---|---|---|---|
primera crida | 10 |
0 |
0 |
[0, 1, 2, 3, 4] |
10 |
segona crida | 10 |
1 |
1 |
[0, 1, 2, 3, 4] |
11 |
tercera crida | 11 |
2 |
2 |
[0, 1, 2, 3, 4] |
13 |
quarta crida | 13 |
3 |
3 |
[0, 1, 2, 3, 4] |
16 |
cinquena crida | 16 |
4 |
4 |
[0, 1, 2, 3, 4] |
20 |
El valor de la crida final (20
) és el retornat per la funció reduce
.
Exemples
Sumar tots els valors d'un array
var total = [0, 1, 2, 3].reduce(function(a, b) { return a + b; }); // total == 6
Aplanar un array d'arrays
var flattened = [[0, 1], [2, 3], [4, 5]].reduce(function(a, b) { return a.concat(b); }, []); // flattened is [0, 1, 2, 3, 4, 5]
Polyfill
Array.prototype.reduce
va ser afegida a l'standard ECMA-262 a la cinquena edició; degut a això aquesta no estar present a totes les implementacions de l'standard. És possible simular-la en aquests casos mitjançant l'inserció del codi que trobareu a continuació a l'inici dels vostres scripts, tot permetent-vos utilitzar reduce
en implementacions que no la suportin de forma nativa.
// Production steps of ECMA-262, Edition 5, 15.4.4.21 // Reference: https://es5.github.io/#x15.4.4.21 if (!Array.prototype.reduce) { Array.prototype.reduce = function(callback /*, initialValue*/) { 'use strict'; if (this == null) { throw new TypeError('Array.prototype.reduce called on null or undefined'); } if (typeof callback !== 'function') { throw new TypeError(callback + ' is not a function'); } var t = Object(this), len = t.length >>> 0, k = 0, value; if (arguments.length == 2) { value = arguments[1]; } else { while (k < len && !(k in t)) { k++; } if (k >= len) { throw new TypeError('Reduce of empty array with no initial value'); } value = t[k++]; } for (; k < len; k++) { if (k in t) { value = callback(value, t[k], k, t); } } return value; }; }
Especificacions
Especificació | Estat | Comentaris |
---|---|---|
ECMAScript 5.1 (ECMA-262) The definition of 'Array.prototype.reduce' in that specification. |
Standard | Definició inicial. Implementat a JavaScript 1.8. |
ECMAScript 2015 (6th Edition, ECMA-262) The definition of 'Array.prototype.reduce' in that specification. |
Standard |
Compatibilitat amb navegadors
Característica | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Suport bàsic | (Yes) | 3.0 (1.9) | 9 | 10.5 | 4.0 |
Característica | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Suport bàsic | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) |