1
resposta

Registro de caixas processadas - Solução alternativa

const caixas = [12, -1, 8, 0, -5, 3, 7, 14];
let contador = 0;
let i = 0

while (contador <= 5 && i < caixas.length){
if (caixas[i] >= 0) {
console.log("Caixa processada: ", caixas[i])
contador++
} else {
console.log("Caixa danificada, ignorada.")
}
i++
}

1 resposta

Olá, Pedro. Como vai?

O seu código traz uma excelente abordagem para resolver o problema! Você utilizou de forma muito inteligente uma condição composta no laço while, o que garante que o programa não continue rodando caso o array de caixas chegue ao fim antes de atingirmos o limite de 5 caixas processadas. Isso evita erros de leitura de índices inexistentes (undefined).

No entanto, analisando o seu código atual, há um pequeno detalhe que causará um loop infinito (o programa ficará rodando para sempre) ou travará a execução.

Vamos entender o motivo e como solucionar isso de forma simples:

O problema do incremento

No seu código, a variável i (que controla qual elemento do array estamos olhando) não está sendo incrementada em nenhum momento. Para que o while passe para a próxima caixa do array, precisamos somar 1 ao i a cada repetição (i++), independentemente de a caixa ser válida ou danificada.

Se não incrementarmos o i, o programa ficará preso eternamente avaliando a primeira caixa do array (caixas[0], que é 12).


Solução Corrigida

Para corrigir isso, basta adicionar o i++ ao final do bloco do while, garantindo que o índice avance a cada iteração:

const caixas = [12, -1, 8, 0, -5, 3, 7, 14];
let contador = 0;
let i = 0;

while (contador <= 5 && i < caixas.length) {
  if (caixas[i] >= 0) {
    console.log("Caixa processada: ", caixas[i]);
    contador++;
  } else {
    console.log("Caixa danificada, ignorada.");
  }
  
  i++; // Incremento essencial para avançar no array
}

Uma alternativa ainda mais limpa: O laço for...of

Como estamos trabalhando com uma lista e queremos analisar os elementos em sequência, uma boa prática em JavaScript moderno é utilizar o laço for...of combinado com a instrução break. Isso deixa o código mais legível e diminui a chance de esquecermos de incrementar as variáveis de controle.

Veja essa alternativa:

const caixas = [12, -1, 8, 0, -5, 3, 7, 14];
let contador = 0;

for (const caixa of caixas) {
  if (contador >= 5) {
    break; // Interrompe o laço assim que processar 5 caixas válidas
  }

  if (caixa >= 0) {
    console.log("Caixa processada: ", caixa);
    contador++;
  } else {
    console.log("Caixa danificada, ignorada.");
  }
}
  • Vantagem: Você não precisa gerenciar manualmente o índice i, o JavaScript faz isso por debaixo dos panos para você.

Parabéns pela iniciativa de buscar uma solução alternativa! Continue praticando a lógica dos laços, pois eles são fundamentais no dia a dia do desenvolvimento.

Espero que possa ter lhe ajudado!