GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Como posso imprimir o somatório de um vetor usando forEach com callback

Olá!

Estou começando a aprender javaScript e tenho a tarefa de encontrar os valores maiores que 60 e menor que 300, realizar o somatório usando foreach exatamente ele pede que:
Depois utilize a função (callback) foreach para somar todos os valores filtrados neste array (armazenar em: $somatorio). Usando template strings, retorne a seguinte mensagem depois da execução do código: “A lista dos valores maiores que 60 é: $lista. A soma dos elementos da lista é: $somatorio”.

Meu problema é esse somatório que não estou entendendo como fazer…

const numeros = [1, 60, 232, 7, 25, 76, 29, 74, 92, 300]

var $lista = numeros.filter(num => num > 60 && num < 300)

console.log($lista)

var $somatorio = 0
numeros.forEach(function (e) {
  let i = 0
  i++
  $somatorio += e
  if (i > e.length) {
    console.log(
      `A lista dos valores maiores que 60 é: ${$lista}. A soma dos elementos da lista é:  ${$somatorio}.`
    )
  }
})

A princípio seria isso:

const numeros = [1, 60, 232, 7, 25, 76, 29, 74, 92, 300];
const filtrados = numeros.filter(n => n > 60 && n < 300);
let soma = 0;
filtrados.forEach(n => soma += n);

// imprimir a soma e o que mais quiser (os números filtrados, etc)
console.log(soma);

Como o filter já retornou os números que você quer, no forEach basta somá-los. E você só imprime o resultado depois, fora do forEach (não faz sentido ficar controlando o índice dentro dele pra saber quando imprimir: se quer imprimir só depois do forEach, então faça isso depois, fora dele).


Mas sinceramente eu acho um exagero. Pode ser que seja um curso, que estejam ensinando filter e forEach e você seja obrigado a usá-los, mas sinceramente, nem sempre é o melhor jeito.

Primeiro que filter retorna outro array. Claro que, se você vai precisar desses números depois, aí pode fazer sentido ter outro array só com os números filtrados. Mas se só quer calcular a soma, ter esse array é desnecessário.

E o forEach também acho exagero, afinal, para cada elemento ele faz uma chamada de função. Sim, aquilo que você passa para o forEach (no caso, n => soma += n) é uma função, e ela é chamada para cada elemento do array.

É claro que para arrays pequenos, a diferença é insignificante, mas para casos maiores isso começa a fazer diferença, já que cada chamada de função tem o seu custo.

De qualquer forma, não precisaria de filter e nem de forEach, basta um for simples:

const numeros = [1, 60, 232, 7, 25, 76, 29, 74, 92, 300];
let soma = 0;
for (const n of numeros) {
    if (n > 60 && n < 300) {
        soma += n;
    }
}

Ou:

const numeros = [1, 60, 232, 7, 25, 76, 29, 74, 92, 300];
let soma = 0;
for (var i = 0; i < numeros.length; i++) {
    var n = numeros[i];
    if (n > 60 && n < 300) {
        soma += n;
    }
}
console.log(soma);
2 Curtidas

Olá!

Entendi, muito obrigado!
Era exatamente isso que queria saber…

Apenas para complementar, uma outra forma poderia ser assim:

tudo bem, não é usando forEach =), mas é sempre bom conhecer mais coisas

const numeros = [1, 60, 232, 7, 25, 76, 29, 74, 92, 300];

const soma = numeros
  .filter(num => num > 60 && num < 300)
  .reduce((agg, num) => agg += num, 0);

console.log(soma); // 474

@ecsmelo. Se a resposta do colega ajudou, depois marque-a como solução. Flws!

1 Curtida

Olá Lucas!

Obrigado!
Muito bom aprender coisas novas…

Atenção: este post contém opiniões.


Provavelmente muitos vão discordar e tacar pedras em mim, mas…

Embora funcione, na minha opinião você não vai precisar de reduce na maioria das vezes. Eu ainda prefiro usar um loop simples, que é mais fácil de fazer e entender (sem contar que não tem as chamadas de função: da mesma forma que já expliquei que ocorre com forEach, o reduce faz uma chamada de função para cada elemento do array - a função, no caso, é o (agg, num) => agg += num que foi passado como argumento). Lembrando do mesmo que já disse também: para arrays pequenos provavelmente não fará diferença…

Obviamente tem casos e casos, há situações em que o reduce pode ser o mais adequado, mas pela minha experiência, na maioria dos casos é um exagero (e muitas vezes deixa o código desnecessariamente mais complicado), e um for ou while já servem muito bem.

Claro que é importante conhecer os recursos da linguagem, mas acho que mais importante do que saber usar é saber quando não usar. E somar elementos de um array é um caso tão simples que para mim não justifica usar reduce.

Mas novamente, essa é só minha opinião.

1 Curtida
//