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