Utilizando Reduce Do Javascript Sem Medo
Muitos desenvolvedores(as) tem um certo medo de utilizar e trabalhar com o Reduce, nesse post irei explicar e falar um pouco sobre o mesmo, tentanto fazer com que você entenda e seja capaz de utilizá-lo ao término da leitura, vamos nessa?
Conhecendo o Reduce
Para você que ainda não conhece o Reduce, o mesmo é uma função (feature) para arrays introduzida na versão ES6 do JavaScript. A ideia é que para cada elemento de um array o Reduce execute uma função de callback, além dela, o Reduce também possuí um acumulador onde o mesmo pode ser incrementado a cada execução da função.
Calculando a média de notas
Imagine que você tenha um array de notas:
const notas = [1, 5, 8, 3, 7, 10, 9, 4];
Como você faria para calcular média de delas? Simples né? Com um for resolvemos o problema.
O primeiro passo, seria ter uma variável para armazenar a soma total de notas e a futura média:
let soma = 0;
let media = 0;
Feito isso, precisamos interar sobre todas as notas e somá-las junto a variável soma:
for (let i = 0; i < notas.length; i++) {
soma += notas[i];
}
Maravillha, por último, precisamos pegar a soma de todas as notas e dividir pela quantidade total, assim, teremos a média delas:
media = soma / notas.length;
Tudo certo, para conferir os valores vamos imprimí-los no console do navegador:
console.log(soma);
console.log(media.toFixed(2));

Como você pode ver, foram impresos os valores 47 e 5.88 (arredondado), assim, temos nosso código funcionando como esparávamos.
O código completo fica da seguinta maneira:
const notas = [1, 5, 8, 3, 7, 10, 9, 4];
let soma = 0;
let media = 0;
for (let i = 0; i < notas.length; i++) {
soma += notas[i];
}
media = soma / notas.length;
console.log(soma);
console.log(media.toFixed(2));
A variável soma foi logada apenas para você ver que a soma foi feita corretamente, mas, nosso alvo é apenas a media.
Melhorando com Reduce
Veja que o código ficou meio grande para uma simples necessidade, será que não podemos melhorá-lo?

Sim, podemos, essa é a ideia de utilizar o Reduce.
O primeiro passo será trocar nosso for, pelo Reduce, como podemos fazer isso? Calma, vamos por partes. O Reduce é uma função de arrays para isso, devemos utilizar nosso array notas para chamá-la:
notas.reduce();
Para que o Reduce funcione da forma que precisamos, devemos passar dois parâmetros para ele, a soma total das notas e a nota atual que estamos iterando no array:
Utilizando function:
notas.reduce(function(soma, nota));
Utlizando arrow function:
notas.reduce((soma, nota));
Certo, para cada iteração devemos pegar o valor da nota atual, somá-la á variável soma e retornar o valor da soma para a próxima iteração:
Utilizando function:
notas.reduce(function(soma, nota) {
return soma += nota;
});
Utlizando arrow function:
notas.reduce((soma, nota) => soma += nota);
Por último, devemos definir um valor inicial para nossa variável soma:
Utilizando function:
notas.reduce(function(soma, nota) {
return soma += nota;
}, 0);
Utlizando arrow function:
notas.reduce((soma, nota) => soma += nota, 0);
Pronto, com isso, já teremos nossa soma total de notas:
Utilizando function:
const soma = notas.reduce(function(soma, nota) {
return soma += nota;
}, 0);
Utlizando arrow function:
const soma = notas.reduce((soma, nota) => soma += nota, 0);
Caso queira, poderíamos fazer tudo em uma única linha:
const media = notas.reduce((soma, nota) => soma += nota, 0) / notas.length;
Obs: O mesmo poderia ser feito utlizando function.
Assim, teríamos o mesmo resultado.
O código completo fica da seguinte maneira:
const notas = [1, 5, 8, 3, 7, 10, 9, 4];
let media = notas.reduce((soma, nota) => soma += nota, 0) / notas.length;
console.log(media.toFixed(2));
Conclusão
Nesse post você vi uma função de arrays chamada Reduce, ela basicamente segue a seguinte sintaxe:
array.reduce((acumulador, indice_atual) => uma_funcao_de_callback, valor_inicial_acumulador);
Além dos parâmetros acumulador e indice_atual, também podemos passar o indice e o array que está executando o Reduce.
Espero que você tenha gostado, não deixe de comentar e se inscrever na newsletter para receber novidades por email, até a próxima.
