Array.prototype.reduce()

Esta tradução está incompleta. Ajude atraduzir este artigo.

Resumo

O método reduce() aplica uma função sobre um acumulador e cada valor do array (da esquerda para direita), deve reduzí-lo a um único valor.

Sintaxe

array.reduce(callback[, initialValue])

Parâmetros

callback
Função que é executada em cada valor no array, recebe quatro argumentos:
previousValue
O valor retornado na última invocação do callback, ou o argumento initialValue, se fornecido. (exemplo abaixo).
currentValue
O elemento atual que está sendo processado no array.
index
O índice do elemento atual que está sendo processado no array.
array
O array ao qual a função reduce foi executada.
initialValue
Opcional. Objeto a ser usado como o primeiro argumento da primeira chamada da função callback.

Descrição

O reduce  executa a função de callback uma vez para cada elemento presente no array, excluindo furos (valores indefinidos) , recebendo quatro argumentos: o valor inicial (ou o valor do callback anterior), o valor do elemento corrente, o índice corrente e o array onde a iteração está ocorrendo.

A primeira vez que o callback é chamado, o previousValue e o currentValue podem ter um de dois valores possíveisSe o  initialValue tiver sido fornecido na chamada à função reduce, então o previousValue será igual a initialValue e currentValue será igual ao primeiro valor no array. Se initialValue não tiver sido passado como argumento, então previousValue será igual ao primeiro valor no array e currentValue será igual ao segundo.

Se o array estiver vazio e initialValue não tiver sido informado, uma exceção do tipo TypeError será lançada. Se o array possuir somente um elemento (independente da posição) e initialValue não tiver sido fornecido, ou se initialValue for fornecido, mas o array estiver vazio, o valor será retornado sem que a função de callback seja chamada.

Suponha o seguinte uso de reduce tenha ocorrido:

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

O callback será invocado quatro vezes com os argumentos e retorna os valores em cada chamada, como sendo:

  previousValue currentValue index array valor de retorno
primeira chamada 0 1 1 [0, 1, 2, 3, 4] 1
segunda chamada 1 2 2 [0, 1, 2, 3, 4] 3
terceira chamada 3 3 3 [0, 1, 2, 3, 4] 6
quarta chamada 6 4 4 [0, 1, 2, 3, 4] 10

O valor retornado pelo reduce será o da última chamada à callback (10).

Se você informar um valor inicial como o segundo argumento de reduce, o resultado será:

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

// 20
  previousValue currentValue index array valor de retorno
primeira chamada 10 0 0 [0, 1, 2, 3, 4] 10
segunda chamada 10 1 1 [0, 1, 2, 3, 4] 11
terceira chamada 11 2 2 [0, 1, 2, 3, 4] 13
quarta chamada 13 3 3 [0, 1, 2, 3, 4] 16
quinta chamada 16 4 4 [0, 1, 2, 3, 4] 20

O retorno da última chamada (20) é retornado como resultado da função reduce.

Exemplos

Soma todos os valores de um array

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

Redução de um array de arrays

var reduzido = [[0, 1], [2, 3], [4, 5]].reduce(function(a, b) {
  return a.concat(b);
});
// reduzido é [0, 1, 2, 3, 4, 5]

Polyfill

Array.prototype.reduce foi adicionado ao padrão ECMA-262  na quinta edição; e portanto, pode não estar presente em todas as implementações do padrão. Você pode contornar isso inserindo o código a seguir no início de seus scripts, permitindo o uso do reduce em implementações que não possuem suporte nativo a ele.

// Etapas de produção para o ECMA-262, Edition 5, 15.4.4.21
// Referencia: http://es5.github.io/#x15.4.4.21
if (!Array.prototype.reduce) {
  Array.prototype.reduce = function(callback /*, valorInicial*/) {
    'use strict';
    if (this == null) {
      throw new TypeError('Array.prototype.reduce chamado é nulo (null) ou indefinido (undefined)');
    }
    if (typeof callback !== 'function') {
      throw new TypeError(callback + ' não é uma função')
    }
    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 possui um array vazio sem um valor inicial');
      }
      value = t[k++];
    }
    for (; k < len; k++) {
      if (k in t) {
        value = callback(value, t[k], k, t);
      }
    }
    return value;
  };
}

Especificações

Especificação Status Comentário
ECMAScript 5.1 (ECMA-262)
The definition of 'Array.prototype.reduce' in that specification.
Standard

Definição inicial. Implemetada no JavaScript 1.8.

ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Array.prototype.reduce' in that specification.
Standard  

Compatibilidade do Browser

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari Microsoft Edge
Suporte básico (Yes) 3.0 (1.9) 9 10.5 4.0 (Yes)
Feature Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Suporte básico (Yes) (Yes) (Yes) (Yes) (Yes) (Yes)

Leia também

Etiquetas do documento e colaboradores

 Colaboradores desta página: alexgwolff, FrancisWagner, ErickWendel
 Última atualização por: alexgwolff,