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

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!
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茅