Array.prototype.reduce()

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: http://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)

Vegeu també

Document Tags and Contributors

 Contributors to this page: enTropy
 Last updated by: enTropy,