Truthy e Falsy nelle Collezioni JavaScript: filtrare dati senza errori

by Anastasia P.
SHARE
Truthy e Falsy nelle Collezioni JavaScript: filtrare dati senza errori
© Guida-HTML5.it

Introduzione

In JavaScript, i concetti di truthy e falsy diventano particolarmente utili quando si lavora con collezioni di dati, come array di prodotti, utenti o risultati provenienti da un’API. Molti metodi degli array, tra cui filter(), find() e some(), utilizzano il valore restituito da una funzione per decidere se un elemento deve essere mantenuto, restituito o considerato valido.

Un valore è truthy quando viene interpretato come vero in un contesto booleano. Un valore è invece falsy quando viene interpretato come falso. Tra i principali valori falsy troviamo:

  • false
  • 0
  • -0
  • "", cioè una stringa vuota
  • null
  • undefined
  • NaN

Tutti gli oggetti e gli array sono truthy, anche quando sono vuoti. Questo è un punto importante: [] e {} sono considerati veri nelle condizioni, perché sono oggetti realmente esistenti.

Il sotto-argomento di questo tutorial è l’uso consapevole della truthiness durante il filtraggio e la ricerca di elementi nelle collezioni. L’obiettivo è evitare filtri troppo generici, che potrebbero eliminare dati validi come il numero 0 oppure mantenere elementi che non dovrebbero essere considerati utilizzabili.

Codice completo

const prodotti = [
  { nome: "Tastiera", prezzo: 49, disponibilita: 12 },
  { nome: "Mouse", prezzo: 0, disponibilita: 5 },
  { nome: "", prezzo: 25, disponibilita: 3 },
  { nome: "Monitor", prezzo: 199, disponibilita: 0 },
  { nome: "Webcam", prezzo: null, disponibilita: 8 },
  null
];

// Filtro generico: elimina solo i valori falsy.
// È utile per rimuovere null o undefined,
// ma non verifica la qualità degli oggetti.
const elementiPresenti = prodotti.filter(Boolean);

console.log("Elementi presenti:", elementiPresenti);

// Filtro specifico: controlla ogni proprietà in modo esplicito.
const prodottiValidi = prodotti.filter((prodotto) => {
  return prodotto !== null
    && typeof prodotto.nome === "string"
    && prodotto.nome.trim() !== ""
    && typeof prodotto.prezzo === "number"
    && !Number.isNaN(prodotto.prezzo)
    && prodotto.prezzo >= 0
    && typeof prodotto.disponibilita === "number"
    && prodotto.disponibilita > 0;
});

console.log("Prodotti validi:", prodottiValidi);

// find() considera truthy il valore restituito dalla callback.
// Qui cerchiamo il primo prodotto realmente disponibile.
const primoDisponibile = prodotti.find((prodotto) => {
  return prodotto && prodotto.disponibilita > 0;
});

console.log("Primo prodotto disponibile:", primoDisponibile);

// some() restituisce true appena trova un elemento
// per cui la callback restituisce un valore truthy.
const esisteUnProdottoGratuito = prodotti.some((prodotto) => {
  return prodotto
    && typeof prodotto.prezzo === "number"
    && prodotto.prezzo === 0;
});

console.log("Esiste un prodotto gratuito?", esisteUnProdottoGratuito);

Spiegazione

Usare filter(Boolean)

Il codice array.filter(Boolean) è una forma compatta per mantenere soltanto gli elementi truthy. In pratica, JavaScript esegue qualcosa di equivalente a:

const risultato = valori.filter((valore) => Boolean(valore));

Questa tecnica è utile quando un array contiene valori come null o undefined e si desidera rimuoverli rapidamente. Tuttavia, il filtro non controlla la struttura degli oggetti. Nell’esempio, un oggetto con nome: "" rimane nell’array perché l’oggetto stesso è truthy, anche se una sua proprietà è una stringa vuota.

Inoltre, filter(Boolean) rimuoverebbe anche valori validi come 0, false e stringhe vuote. Per esempio, se un array contiene prezzi, il prezzo zero potrebbe rappresentare un prodotto gratuito e non un dato mancante.

Controllare le proprietà in modo esplicito

Quando i dati hanno una struttura precisa, è preferibile scrivere condizioni più specifiche. Nell’esempio, il prezzo viene verificato con typeof prodotto.prezzo === "number". In questo modo il valore 0 non viene scartato automaticamente: viene accettato perché è un numero valido.

La condizione prodotto.prezzo >= 0 impedisce invece di accettare prezzi negativi. Per il nome viene usato trim(), così anche una stringa composta solo da spazi viene considerata vuota:

prodotto.nome.trim() !== ""

Questa distinzione è importante: verificare semplicemente if (prodotto.nome) impedisce di accettare una stringa vuota, ma non descrive chiaramente tutte le regole di validazione richieste.

Truthy nei metodi find() e some()

Il metodo find() restituisce il primo elemento per cui la callback produce un valore truthy. La condizione:

prodotto && prodotto.disponibilita > 0

prima verifica che prodotto esista. Se il valore è null, l’espressione si interrompe e non prova ad accedere a disponibilita. Questo evita l’errore “Cannot read properties of null”.

Il metodo some(), invece, restituisce un booleano. È adatto per rispondere a domande come “esiste almeno un prodotto gratuito?” o “c’è almeno un elemento disponibile?”. La callback dovrebbe quindi esprimere chiaramente la condizione da verificare, senza affidarsi a una truthiness generica.

Best practice

  • Usa filter(Boolean) solo per rimuovere valori completamente assenti, come null e undefined, quando anche 0, false e stringhe vuote devono essere eliminati.
  • Non usare la truthiness come sostituto della validazione. Un oggetto truthy può avere proprietà mancanti, errate o vuote.
  • Tratta lo zero con attenzione. Il valore 0 è falsy, ma può essere perfettamente valido per prezzi, contatori, coordinate o quantità.
  • Controlla prima l’oggetto e poi le sue proprietà. Questo evita di accedere a proprietà di null o undefined.
  • Preferisci condizioni leggibili. Espressioni come prezzo >= 0 comunicano meglio l’intenzione rispetto a un generico if (prezzo).
  • Ricorda che array e oggetti vuoti sono truthy. Per verificare se un array contiene elementi usa array.length > 0, non semplicemente if (array).
  • Usa Number.isNaN() per controllare i valori numerici non validi. NaN è falsy, ma una validazione esplicita rende il codice più comprensibile.

Riepilogo

Truthy e falsy permettono a JavaScript di valutare i valori in modo implicito, ma nelle collezioni è importante capire esattamente che cosa viene considerato vero o falso. filter(Boolean) è una scorciatoia efficace per eliminare valori assenti, ma non può sostituire una validazione strutturale.

Quando si lavora con dati reali, è meglio controllare esplicitamente le proprietà degli oggetti e distinguere tra un valore mancante e un valore valido ma falsy, come 0. I metodi filter(), find() e some() diventano così strumenti potenti e prevedibili per filtrare, cercare e analizzare array.

Approfondisci con risorse ufficiali

SHARE