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íveis.
Se 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) |