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 (en-US). 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

We're converting our compatibility data into a machine-readable JSON format. This compatibility table still uses the old format, because we haven't yet converted the data it contains. Find out how you can help! (en-US)
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茅