Cicli in JavaScript per validare dati e ripetere tentativi: for, while e do...while

by Anastasia P.
SHARE
Cicli in JavaScript per validare dati e ripetere tentativi: for, while e do...while
© Guida-HTML5.it

Introduzione

I cicli sono uno degli strumenti più utili in JavaScript quando devi ripetere un’operazione più volte. In questa guida non ci limiteremo a vedere la sintassi base di for, while e do...while, ma li useremo in un caso pratico molto comune: validare una sequenza di input e ripetere i tentativi finché i dati non sono corretti.

Questo scenario è utile in molte situazioni reali: compilazione di form, inserimento di password, controllo di valori numerici, gestione di menù testuali o verifica di dati provenienti da un array. Sapere scegliere il ciclo giusto ti aiuta a scrivere codice più leggibile, robusto e facile da mantenere.

Il sotto-argomento che approfondiamo qui è quindi: come usare i cicli per validare input e gestire ripetizioni controllate. È un tema pratico, spesso sottovalutato, ma fondamentale nello sviluppo JavaScript.

Codice completo

// Esempio: validazione di una lista di età inserite come stringhe
// Obiettivo:
// - scorrere i valori
// - ignorare quelli non validi
// - fermarsi quando troviamo un valore valido
// - ripetere una richiesta finché l´utente non inserisce un numero corretto

const inputAgeList = ["", "abc", "-2", "17", "24", " 31 ", "forty"];

// Funzione di supporto per verificare se un valore è un intero valido
function parseValidAge(value) {
  const trimmed = value.trim();
  const age = Number(trimmed);

  if (trimmed === "") {
    return null; // input vuoto
  }

  if (!Number.isInteger(age)) {
    return null; // non è un intero
  }

  if (age <0 || age > 120) {
    return null; // valore fuori range plausibile
  }

  return age;
}

// 1) FOR: scorre una lista di input e cerca il primo valore valido
let firstValidAge = null;

for (let i = 0; i < inputAgeList.length; i++) {
  const candidate = parseValidAge(inputAgeList[i]);

  if (candidate !== null) {
    firstValidAge = candidate;
    break; // fermiamo il ciclo appena troviamo un dato corretto
  }
}

console.log("Primo valore valido trovato con for:", firstValidAge);

// 2) WHILE: continua a controllare finché non trova un valore valido
let index = 0;
let lastValidAge = null;

while (index < inputAgeList.length && lastValidAge === null) {
  const candidate = parseValidAge(inputAgeList[index]);

  if (candidate !== null) {
    lastValidAge = candidate;
  } else {
    index++;
  }
}

console.log("Primo valore valido trovato con while:", lastValidAge);

// 3) DO...WHILE: esegue almeno una volta il blocco
// Simuliamo una richiesta ripetuta all´utente usando una lista di tentativi
const simulatedUserInputs = ["", "   ", "200", "29"];
let attempt = 0;
let userAge = null;

do {
  const currentInput = simulatedUserInputs[attempt];
  userAge = parseValidAge(currentInput);

  console.log(`Tentativo ${attempt + 1}:`, currentInput);

  attempt++;
} while (userAge === null && attempt < simulatedUserInputs.length);

console.log("Età valida ottenuta con do...while:", userAge);

// 4) Esempio pratico: conteggio dei valori validi in un array
let validCount = 0;

for (let i = 0; i < inputAgeList.length; i++) {
  if (parseValidAge(inputAgeList[i]) !== null) {
    validCount++;
  }
}

console.log("Numero di valori validi:", validCount);

Spiegazione

Nel codice sopra abbiamo creato una funzione di utilità, parseValidAge, che riceve un valore e restituisce:

  • un numero, se l’input è valido;
  • null, se l’input non è accettabile.

Questa scelta è molto utile perché separa la logica di validazione dal ciclo. In pratica, il ciclo si occupa di iterare, mentre la funzione si occupa di decidere se un dato è valido.

1. Il ciclo for

Il ciclo for è perfetto quando sai quante volte devi iterare o quando stai scorrendo un array. Nel nostro esempio, attraversa la lista inputAgeList da sinistra a destra e si ferma appena trova il primo valore valido.

La riga più importante è:

if (candidate !== null) {
  firstValidAge = candidate;
  break;
}

Qui usiamo break per interrompere il ciclo non appena abbiamo ottenuto il risultato desiderato. Questa è una pratica molto comune quando vuoi evitare iterazioni inutili.

2. Il ciclo while

Il ciclo while è adatto quando non sai a priori quante iterazioni serviranno. Nel nostro esempio, continuiamo a controllare gli elementi finché non troviamo un valore valido oppure finché non finisce l’array.

La condizione del ciclo è:

while (index < inputAgeList.length && lastValidAge === null)

Questo significa: “continua finché ci sono elementi da leggere e non abbiamo ancora trovato un valore valido”.

Il vantaggio di while è la sua flessibilità. Lo svantaggio è che devi gestire manualmente l’indice, quindi è più facile commettere errori se dimentichi di incrementarlo.

3. Il ciclo do...while

Il ciclo do...while è ideale quando vuoi eseguire il blocco almeno una volta. È molto utile per simulare o implementare una richiesta ripetuta all’utente.

Nel nostro esempio, proviamo a leggere più input finché non otteniamo un’età valida. La differenza rispetto a while è importante: con do...while il corpo viene eseguito prima del controllo.

do {
  const currentInput = simulatedUserInputs[attempt];
  userAge = parseValidAge(currentInput);
  attempt++;
} while (userAge === null && attempt < simulatedUserInputs.length);

Questo pattern è molto comune in scenari interattivi: chiedi un dato, lo validi, e se non è corretto chiedi di nuovo.

4. Conteggio dei valori validi

L’ultimo esempio mostra un uso classico del ciclo for: contare gli elementi che soddisfano una condizione. Qui incrementiamo validCount solo quando la funzione di validazione restituisce un valore diverso da null.

Questo tipo di logica è utile per analizzare dati in input, filtrare record o preparare informazioni da mostrare in interfaccia.

Best practice

  • Scegli il ciclo in base al problema: usa for per array e conteggi noti, while per condizioni dinamiche, do...while quando il blocco deve girare almeno una volta.
  • Separa la validazione dalla logica del ciclo: una funzione dedicata rende il codice più chiaro e riutilizzabile.
  • Usa break con criterio: interrompere il ciclo appena trovi il risultato evita lavoro inutile e migliora le prestazioni.
  • Aggiorna sempre l’indice nei while: se dimentichi index++, rischi un ciclo infinito.
  • Proteggi i dati in ingresso: controlla spazi vuoti, conversioni numeriche e range plausibili prima di usare un valore.
  • Preferisci condizioni semplici e leggibili: una condizione troppo complessa rende il ciclo difficile da mantenere e debuggare.

Riepilogo

In questo tutorial abbiamo visto come for, while e do...while possano essere usati in modo pratico per gestire validazione e ripetizione dei tentativi. Il punto chiave non è solo conoscere la sintassi, ma capire quando usare ciascun ciclo.

  • for: perfetto per scorrere array e fermarsi con break quando hai trovato ciò che cerchi.
  • while: utile quando la ripetizione dipende da una condizione che può cambiare durante l’esecuzione.
  • do...while: ideale per input interattivi, perché esegue almeno un tentativo.

Se impari a combinare cicli e funzioni di validazione, il tuo codice diventa subito più solido e professionale. È una competenza fondamentale per costruire form affidabili, flussi guidati e piccoli strumenti di controllo dati.

Approfondisci con risorse ufficiali

  • MDN Web Docs - for statement: documentazione completa sul ciclo for in JavaScript.
  • MDN Web Docs - while statement: guida ufficiale al ciclo while.
  • MDN Web Docs - do...while statement: spiegazione dettagliata del ciclo do...while.
  • MDN Web Docs - Number: utile per comprendere conversioni e validazione numerica.
  • MDN Web Docs - Number.isInteger(): metodo fondamentale per verificare se un valore è un intero.

SHARE