Utilizando reduce do JavaScript sem medo

Javascript

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));

Conferindo valor das variáveis soma e media

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?

Gif pensando em melhorar como código

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.

Matheus Castiglioni

Matheus Castiglioni

Apaixonado pelo mundo dos códigos e um eterno estudante, gosto de aprender e saber um pouco de tudo, aquela curiosidade de saber como tudo funciona, tento compartilhar o máximo de conhecimentos adquiridos e ajudar todos aqueles que sou capaz.