Please note, this is a STATIC archive of website developer.mozilla.org from November 2016, cach3.com does not collect or store any user information, there is no "phishing" involved.

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: https://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,