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).
currentValueO 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) |