programandoai

Percorrer, filtrar e somar: pensando em coleções

Boa parte da programação do dia a dia é isso: pegar uma coleção de coisas e fazer três perguntas sobre ela. Quanto dá tudo somado? Quais itens interessam? Quantos sobraram?

Estudar esta lição interativa →

Com uma lista em mãos, três perguntas aparecem o tempo inteiro em problemas reais: "quanto dá tudo somado?" (o total de um carrinho), "quais itens me interessam?" (só os produtos em promoção), "quantos sobraram?" (quantos itens passaram num filtro). As três respostas seguem o mesmo padrão de pensamento: percorrer a lista inteira com um laço, e ir acumulando um resultado a cada volta.

let numeros = [3, 8, 15, 22, 7, 40];

let soma = 0;
for (let i = 0; i < numeros.length; i++) {
  soma += numeros[i];
}
console.log("Soma:", soma);

let pares = [];
for (let i = 0; i < numeros.length; i++) {
  if (numeros[i] % 2 === 0) {
    pares.push(numeros[i]);
  }
}
console.log("Pares:", pares);

Rode e observe a soma e a lista filtrada, uma de cada vez.

No primeiro laço, soma começa em 0 (o valor neutro de uma soma, "nada ainda") e, a cada volta, recebe o próprio valor mais o item atual: soma += numeros[i]. Essa variável que carrega um resultado acumulado, atualizada a cada volta do laço, se chama acumulador, e é um dos padrões mais reaproveitados de toda a programação.

No segundo laço, pares começa como uma lista vazia (nada filtrado ainda), e a cada volta, só recebe o item atual (pares.push(numeros[i])) quando a condição numeros[i] % 2 === 0 for verdadeira. Esse padrão, percorrer e guardar só o que passa numa condição, se chama filtro.

Pense num caixa de supermercado passando cada produto pelo leitor: a cada item, ele soma o preço ao total que já vinha somando (o acumulador do total da compra), e separa, num saquinho à parte, só os produtos que precisam de sacola extra, como os congelados (o filtro). Ele nunca reinicia o total do zero a cada produto novo; ele carrega o resultado adiante, item após item.

O valor inicial do acumulador importa

Um acumulador de soma sempre começa em 0; um acumulador de filtro (uma lista nova) sempre começa vazio, []. Esses valores iniciais não são arbitrários: são o "ponto de partida neutro" de cada operação, o valor que, combinado com qualquer outro, não muda o resultado (somar 0 não altera nada; uma lista vazia não tem itens ainda).

Inicializar o acumulador dentro do laço zera o resultado a cada volta

Um erro comum é criar a variável acumuladora dentro do laço em vez de antes dele: for (...) { let soma = 0; soma += numeros[i]; } cria uma soma nova, valendo 0, a cada volta (e ela deixa de existir no fim da volta), perdendo tudo que foi somado antes. O acumulador precisa ser criado uma única vez, antes do laço começar, e só atualizado (nunca recriado) a cada volta.

let numeros = [3, 8, 15, 22, 7, 40];

let pares = [];
let resto;
for (let i = 0; i < numeros.length; i++) {
  resto = numeros[i] % 2;
  if (resto = 0) {
    pares.push(numeros[i]);
  }
}
console.log("Pares:", pares);

Rode, veja a lista vazia, troque = por === dentro do if e rode de novo.

Complete o laço para que maiores guarde, na ordem, só os números da lista precos que são maiores que 20, e para que total guarde a soma de todos os preços da lista original.
let precos = [12, 35, 8, 42, 19, 60];
let maiores = [];
let total = 0;

// percorra precos: acumule a soma em total
// e guarde em maiores só os valores maiores que 20

🧩 Este é um exercício com correção automática — abra no app para completá-lo e verificar.

← Voltar ao índice do curso