Articolo originale: How to Use Array and Object Destructuring in JavaScript

L'assegnazione destrutturante è una fantastica funzionalità che è arrivata con ES6. La destrutturazione è un'espressione JavaScript che rende possibile spacchettare i valori dagli array o le proprietà dagli oggetti, in variabili distinte. Cioè possiamo estrarre dati da array e oggetti e assegnarli a delle variabili.

Perché è necessario?

Immagina di voler estrarre i dati da un array. Come avresti fatto in passato?

let introduction = ["Hello", "I" , "am", "Sarah"];
let greeting = introduction[0];
let name = introduction[3];

console.log(greeting);//"Hello"
console.log(name);//"Sarah"

Come puoi vedere, quando vogliamo estrarre dei dati da un array, dobbiamo fare la stessa cosa ancora e ancora.

L'assegnazione destrutturante ES6 rende più semplice l'estrazione dei dati. Ma come si usa?

Prima parleremo dell'assegnazione destrutturante con gli array e poi ci sposteremo alla destrutturazione di oggetti.

Iniziamo!

Destrutturazione base di array

Se vogliamo estrarre dati da un array, usare l'assegnazione destrutturante è piuttosto semplice.

Facciamo riferimento al nostro primo esempio per gli array. Invece di eseguire quel processo ripetitivo, possiamo fare così:

let introduction = ["Hello", "I" , "am", "Sarah"];
let [greeting, pronoun] = introduction;

console.log(greeting);//"Hello"
console.log(pronoun);//"I"

Possiamo anche fare questo, con lo stesso risultato:

let [greeting, pronoun] = ["Hello", "I" , "am", "Sarah"];

console.log(greeting);//"Hello"
console.log(pronoun);//"I"

Dichiarare variabili prima dell'assegnazione

Le variabili possono essere dichiarate prima di essere assegnate, così:

let greeting, pronoun;
[greeting, pronoun] = ["Hello", "I" , "am", "Sarah"];

console.log(greeting);//"Hello"
console.log(pronoun);//"I"

Nota che le variabili sono impostate da sinistra a destra, quindi la prima variabile ottiene il primo elemento nell'array, la seconda variabile ottiene il secondo elemento nell'array e così via.

Saltare degli elementi in un array

E se volessimo ottenere il primo e l'ultimo elemento del nostro array invece del primo e del secondo, assegnando solo due variabili? Si può fare anche questo. Guarda all'esempio qui sotto:

let [greeting,,,name] = ["Hello", "I" , "am", "Sarah"];

console.log(greeting);//"Hello"
console.log(name);//"Sarah"

Cosa è successo?

Guarda l'array sul lato sinistro dell'assegnazione della variabile. Nota che invece di avere solo una virgola, ne ha tre. La virgola è il separatore usato per saltare i valori in un array. Quindi se vuoi saltare un elemento in un array, usa semplicemente una virgola.

Facciamo un altro esempio. Saltiamo il primo e il terzo elemento della lista. Come possiamo fare?

let [,pronoun,,name] = ["Hello", "I" , "am", "Sarah"];

console.log(pronoun);//"I"
console.log(name);//"Sarah"

È la virgola che compie la magia, quindi se vogliamo saltare tutti gli elementi, possiamo farlo in questo modo:

let [,,,,] = ["Hello", "I" , "am", "Sarah"];

Assegnare il resto di un array

E se volessimo assegnare una parte dell'array a delle variabili e il resto degli elementi dell'array a una particolare variabile? In questo caso, possiamo agire così:

let [greeting,...intro] = ["Hello", "I" , "am", "Sarah"];

console.log(greeting);//"Hello"
console.log(intro);//["I", "am", "Sarah"]

Usando questo modello, puoi estrarre e assegnare la parte rimanente di un array a una variabile.

Assegnazione destrutturante con le funzioni

È possibile anche estrarre dati da un array restituito da una funzione. Diciamo che abbiamo una funzione che restituisce un array come nell'esempio qui sotto:

function getArray() {
    return ["Hello", "I" , "am", "Sarah"];
} 
let [greeting,pronoun] = getArray();

console.log(greeting);//"Hello"
console.log(pronoun);//"I"

Otteniamo lo stesso risultato.

Usare dei valori predefiniti

I valori predefiniti possono essere assegnati alle variabili nel caso in cui il valore estratto dall'array sia undefined:

let [greeting = "hi",name = "Sarah"] = ["Hello"];

console.log(greeting);//"Hello"
console.log(name);//"Sarah"

Quindi name ripiega su "Sarah" perché non è definito nell'array.

Scambiare valori usando l'assegnazione destrutturante

Un'ultima cosa: possiamo usare l'assegnazione destrutturante per scambiare i valori delle variabili:

let a = 3;
let b = 6;

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

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

E adesso, passiamo alla destrutturazione di oggetti.

Destrutturazione di oggetti

Per prima cosa, vediamo perché è necessaria la destrutturazione di oggetti.

Diciamo che vogliamo estrarre dati da un oggetto e assegnarli a nuove variabili. Prima di ES6, come avremmo fatto?

let person = {name: "Sarah", country: "Nigeria", job: "Developer"};

let name = person.name;
let country = person.country;
let job = person.job;

console.log(name);//"Sarah"
console.log(country);//"Nigeria"
console.log(job);//Developer"

Puoi vedere quanto è tedioso estrarre tutti i dati. Dobbiamo fare ripetutamente la stessa cosa. La destrutturazione ES6 salva la nostra giornata. Andiamo subito al dunque.

Destrutturazione base di oggetti

Ripetiamo l'esempio precedente con ES6. Invece di assegnare i valori uno alla volta, possiamo usare l'oggetto sulla sinistra per estrarre i dati:

let person = {name: "Sarah", country: "Nigeria", job: "Developer"};

let {name, country, job} = person;

console.log(name);//"Sarah"
console.log(country);//"Nigeria"
console.log(job);//Developer"

Otterrai lo stesso risultato. È valido anche assegnare le variabili tramite un oggetto che non è stato dichiarato:

let {name, country, job} = {name: "Sarah", country: "Nigeria", job: "Developer"};

console.log(name);//"Sarah"
console.log(country);//"Nigeria"
console.log(job);//Developer"

Variabili dichiarate prima di essere assegnate

Le variabili negli oggetti possono essere dichiarate prima di essere assegnate con la destrutturazione. Proviamoci:

let person = {name: "Sarah", country: "Nigeria", job: "Developer"}; 
let name, country, job;

{name, country, job} = person;

console.log(name);// Error : "Unexpected token ="

Un momento, cos'è successo?! Oh, abbiamo dimenticato di aggiungere () prima delle parentesi graffe.

Le parentesi ( ) attorno all'istruzione sono richieste dalla sintassi quando usiamo l'assegnazione destrutturante di oggetti letterali senza una dichiarazione. Questo perché le parentesi graffe {} sul lato sinistro sono considerate un blocco e non un oggetto letterale. Dunque, ecco come farlo nel modo corretto:

let person = {name: "Sarah", country: "Nigeria", job: "Developer"};
let name, country, job;

({name, country, job} = person);

console.log(name);//"Sarah"
console.log(job);//"Developer"

È anche importante notare che usando questa sintassi, le parentesi () dovrebbero essere precedute da un punto e virgola. Altrimenti potrebbero essere usate per eseguire una funzione della riga precedente.

Nota che le variabili nell'oggetto sul lato sinistro dovrebbero avere lo stesso nome delle chiavi delle proprietà nell'oggetto person. Se i nomi sono diversi, otterrai undefined:

let person = {name: "Sarah", country: "Nigeria", job: "Developer"};

let {name, friends, job} = person;

console.log(name);//"Sarah"
console.log(friends);//undefined

Ma se vuoi usare un nuovo nome per le variabili, c'è un modo per farlo.

Usare un nuovo nome di variabile

Se vogliamo assegnare i valori di un oggetto a delle nuove variabili invece di usare il nome delle proprietà, possiamo fare in questo modo:

let person = {name: "Sarah", country: "Nigeria", job: "Developer"};

let {name: foo, job: bar} = person;

console.log(foo);//"Sarah"
console.log(bar);//"Developer"

Quindi i valori estratti vengono assegnati alle nuove variabili foo e bar.

Usare valori predefiniti

I valori predefiniti possono anche essere usati nella destrutturazione di oggetti, nel caso in cui una variabile sia undefined nell'oggetto da cui vogliamo estrarre i dati:

let person = {name: "Sarah", country: "Nigeria", job: "Developer"};

let {name = "myName", friend = "Annie"} = person;

console.log(name);//"Sarah"
console.log(friend);//"Annie"

Quindi se il valore non è undefined, la variabile conserva il valore estratto dall'oggetto come nel caso di name. Altrimenti, viene usato il valore predefinito, come nel caso di friend.

Possiamo impostare dei valori predefiniti anche quando assegniamo valori a una nuova variabile:

let person = {name: "Sarah", country: "Nigeria", job: "Developer"};

let {name:foo = "myName", friend: bar = "Annie"} = person;

console.log(foo);//"Sarah"
console.log(bar);//"Annie"

Quindi name è stato estratto da person e assegnato a una variabile diversa. friend, d'altro canto, era undefined in person, quindi alla nuova variabile bar è stato assegnato il valore predefinito.

Computed Property Name

Computed property name è un'altra funzionalità degli oggetti letterali che funziona anche per la destrutturazione. Puoi specificare il nome di una proprietà attraverso un'espressione se lo inserisci in parentesi quadre:

let prop = "name";

let {[prop] : foo} = {name: "Sarah", country: "Nigeria", job: "Developer"};

console.log(foo);//"Sarah"

Combinare array e oggetti

Gli array possono essere usati anche con gli oggetti nella destrutturazione di oggetti:

let person = {name: "Sarah", country: "Nigeria", friends: ["Annie", "Becky"]};

let {name:foo, friends: bar} = person;

console.log(foo);//"Sarah"
console.log(bar);//["Annie", "Becky"]

Annidamento nella destrutturazione di oggetti

Quando operiamo una destrutturazione, gli oggetti possono anche essere annidati:

let person = {
    name: "Sarah",
    place: {
        country: "Nigeria", 
        city: "Lagos" }, 
    friends : ["Annie", "Becky"]
};

let {name:foo,
     place: {
         country : bar,
         city : x}
    } = person;

console.log(foo);//"Sarah"
console.log(bar);//"Nigeria"

Il resto nella destrutturazione di oggetti

La sintassi rest può essere anche usata per scegliere chiavi di proprietà che non sono ancora state raccolte dallo schema di destrutturazione. Queste chiavi e i loro valori vengono copiati in un nuovo oggetto:

let person = {name: "Sarah", country: "Nigeria", job: "Developer" friends: ["Annie", "Becky"]};

let {name, friends, ...others} = person;

console.log(name);//"Sarah"
console.log(friends);//["Annie", "Becky"]
console.log(others);// {country: "Nigeria", job: "Developer"}

Qui, le proprietà rimanenti le cui chiavi non sono comprese tra i nomi delle variabili elencate, sono assegnate alla variabile others. La sintassi rest è ...others. others può essere rinominata in qualsiasi modo desideri.

Un'ultima cosa – vediamo come possiamo usare la destrutturazione di oggetti nelle funzioni.

Destrutturazione di oggetti e funzioni

La destrutturazione di oggetti può essere usata per assegnare parametri a delle funzioni:

function person({name: x, job: y} = {}) {
    console.log(x);
}

person({name: "Michelle"});//"Michelle"
person();//undefined
person(friend);//Error : friend is not defined

Nota le parentesi graffe {} sul lato destro dei parametri dell'oggetto. Rendono possibile chiamare la funzione senza passare  argomenti. Ecco perché otteniamo undefined. Se le rimuoviamo riceveremo un messaggio di errore.

Possiamo assegnare anche dei valori predefiniti ai parametri:

function person({name: x = "Sarah", job: y = "Developer"} = {}) {
    console.log(x);
}

person({name});//"Sarah"

Come abbiamo visto in tutti questi esempi, con la destrutturazione di array e oggetti possiamo fare tante cose.

Grazie per aver letto questo articolo. :)