front-end javascript Intermediate 3 min

Destructuring: array, oggetti, default, nested, rest

Swap di variabili, parametri di funzione, import destructuring

· 605 parole

Prendere un array o un oggetto e «spacchettarlo» in singole variabili, senza scrivere array[0], array[1] o oggetto.proprietà a mano. Il destructuring è esattamente cio che ci serve: una sintassi che permette di estrarre valori da array, o proprietà da oggetti, in variabili distinte.

Immaginiamo di aprire una busta della spesa e distribuire direttamente ogni articolo al suo posto: il latte in frigo, il pane nel cestino, le uova nello scomparto giusto; invece di tirare fuori la busta intera e frugarci dentro ogni volta che ti serve qualcosa.

1. Destructuring di array: posizione, non nome

const colori = ["rosso", "verde", "blu"];

const [primo, secondo, terzo] = colori;

console.log(primo); // "rosso"

Scambiare due variabili senza una variabile temporanea: prima serviva sempre un contenitore d'appoggio.

let a = 1;
let b = 3;

[a, b] = [b, a];

console.log(a); // 3
console.log(b); // 1

Puoi anche ignorare i valori che non ti servono, lasciando lo spazio vuoto tra virgole:

const [primo, , terzo] = ["a", "b", "c"];

console.log(primo); // "a"
console.log(terzo); // "c"

Fonte: MDN Web Docs — «Destructuring assignment»: due valori possono essere scambiati in una sola espressione di destructuring, senza variabile temporanea; è possibile ignorare elementi lasciandoli vuoti tra le virgole.

2. Destructuring di oggetti: per nome, con valori di default

Con gli oggetti, il destructuring lavora per nome della proprietà, non per posizione. Puoi anche assegnare un valore di default da usare quando la proprietà risulta undefined.

const utente = {
    nome: "Ada",
    ruolo: "admin"
};

const { nome, ruolo } = utente;

console.log(nome); // "Ada"

const { nome, eta = 18 } = utente; // eta non esiste sull'oggetto

console.log(eta); // 18 -- il default e' usato solo se il valore e' undefined

3. Nested destructuring: dentro oggetti e array annidati

Il destructuring può scendere più livelli in profondità, rispecchiando la forma della struttura dati originale.

const risposta = {
    utente: {
        nome: "Ada",
        indirizzo: {
            citta: "Roma"
        }
    },
    ruoli: ["admin", "editor"]
};

const {
    utente: {
        nome,
        indirizzo: {
            citta
        }
    },
    ruoli: [primoRuolo]
} = risposta;

console.log(nome, citta, primoRuolo); // "Ada" "Roma" "admin"

Nota importante: nome e citta diventano variabili dirette, non esiste una variabile intermedia utente o indirizzo a meno di dichiararla esplicitamente.

4. Rest pattern: il resto in un colpo solo

Sia negli array sia negli oggetti, il pattern ...resto raccoglie tutto ciò che non è stato destrutturato esplicitamente, in un nuovo array o oggetto.

const [primo, ...altri] = [1, 2, 3, 4];

console.log(primo); // 1
console.log(altri); // [2, 3, 4]

const { id, ...restoOggetto } = {
    id: 1,
    nome: "Ada",
    ruolo: "admin"
};

console.log(restoOggetto); // { nome: "Ada", ruolo: "admin" }

Regola fissa dal manuale: il rest pattern deve essere l'ultimo elemento della lista, e non può avere una virgola finale dopo di sé, è un errore di sintassi.

5. Nei parametri di funzione e negli import

Il destructuring funziona anche direttamente nei parametri di una funzione; comodo quando una funzione riceve un oggetto di opzioni e ti servono solo alcune proprietà.

function creaBottone({ testo, colore = "blu" }) {
    return `<button style="color:${colore}">${testo}</button>`;
}

creaBottone({ testo: "Invia" }); // usa il colore di default

Lo stesso pattern è alla base della sintassi import { qualcosa } from "modulo": stai destrutturando le esportazioni nominate di un modulo, esattamente come faresti con le proprietà di un oggetto.

import { useState, useEffect } from "react";

// equivalente concettualmente a:
// const { useState, useEffect } = React;

In sintesi

Pattern Cosa fa Esempio
Array [a, b] Per posizione const [x, y] = [1, 2]
Oggetto { a, b } Per nome della proprietà const { nome } = utente
Default = valore Usato solo se il valore è undefined const { eta = 18 } = utente
Nested Scende nei livelli della struttura dati { a: { b } } = obj
Rest ...resto Raccoglie il resto, sempre per ultimo const [a, ...b] = arr

Il destructuring non aggiunge una funzionalità nuova, tutto ciò che fa era già possibile prima, a mano. Aggiunge però chiarezza: il codice dichiara esplicitamente quali pezzi di una struttura ti interessano, invece di nasconderli dentro accessi ripetuti.

Accedi o registrati per votare, salvare o commentare la pillola

Commenti (0)

Registrati per commentare, fare domande e proporre l'argomento della prossima pillola (oppure accedi se hai già un account).

Nessun commento. Sii il primo a scrivere qualcosa.

Pillole correlate