Múltiplas formas de somar os valores de um array de objetos, em TypeScript
Há algum tempo, o Zan Franceschi postou o seguinte desafio:
Neste artigo, vou resolvê-lo de duas formas: uma com laços e outra sem laços, com TypeScript.
Analisando os dados
Vou transcrever o JSON do desafio para facilitar a nossa análise:
Podemos definir o JSON acima em dois tipos distintos: Produto
e Compra
. Seus nomes são autoexplicativos, mas vou defini-los aqui para facilitar a leitura do código:
Escrevendo testes
Antes de começar a escrever o código, vamos escrever alguns testes para garantir que o código está funcionando corretamente. Para isso, vamos usar o Vitest.
Somando com laços
Agora que já temos os tipos definidos, podemos começar a resolver o desafio. Podemos fazer isso de quatro formas:
1. Usando for
O for
é um laço de repetição que executa um bloco de código até que uma condição seja satisfeita.
2. Usando for...of
O for...of
é um laço de iteração que itera sobre uma sequência de valores vindos de um objeto iterável (que, no nosso caso, é um Array).
3. Usando for...in
O for...in
é um laço de iteração que itera sobre as propriedades enumeráveis do tipo string de um objeto, inclusive as herdadas. Estou colocando esta solução aqui somente para mostrar que ela é possível, mas deve ser preterida em relação às outras soluções apresentadas neste artigo.
4. Usando while
O while
é um laço de repetição que executa um bloco de código até que uma condição seja satisfeita.
Somando com métodos de Array
1. Usando Array.prototype.forEach
O Array.prototype.forEach
é um método que executa uma função para cada elemento do array.
2. Usando Array.prototype.reduce
O Array.prototype.reduce
é um método que executa uma função para cada elemento do array, retornando um único valor.
Mas, podemos torná-la ainda melhor usando o Array.prototype.flatMap
:
Com uma função de ajuda
Podemos criar uma função genérica que faz a soma de qualquer array da seguinte forma:
E usá-la em conjunto com as soluções já apresentadas:
Se tiver alguma sugestão ou alguma outra ideia de como resolver este desafio, conta para mim nos comentários.