3 modi per clonare superficialmente gli oggetti in JavaScript (con bonus)

In questo post, troverete 3 modi semplici per eseguire un clone superficiale (o copia) di oggetti in JavaScript.

Come bonus, mostrerò come potete anche aggiornare, aggiungere o rimuovere proprietà sul posto nel clone. Questo è utile quando si vuole eseguire un aggiornamento sull’oggetto in modo immutabile.

Nota

I 3 modi per clonare oggetti descritti in questo post eseguono una copia superficiale.

Una copia superficiale significa che solo l’oggetto effettivo viene copiato. Se l’oggetto copiato contiene oggetti annidati – questi oggetti annidati non vengono clonati.

Tabella dei contenuti

  • 1. Clonazione usando l’oggetto spread
  • 2. Clonazione usando l’oggetto rest
  • 3. Clonazione usando Object.assign()
  • 4. Sommario

1. Clonare usando object spread

Il modo più semplice per clonare un semplice oggetto JavaScript è invocare l’operatore object spread:

const clone = { ...object};

dove object è l’oggetto che volete copiare, e clone è la copia superficiale di object.

Per esempio, creiamo una copia superficiale dell’oggetto hero:

const hero = { name: 'Batman', city: 'Gotham'};const heroClone = { ...hero};heroClone; // { name: 'Batman', city: 'Gotham' }hero === heroClone; // => false

heroClone è un oggetto clone di hero, cioè contiene tutte le proprietà di hero.

hero === heroClone evaluta in falsehero e heroClone sono, tuttavia, istanze di oggetti differenti.

1.1 Bonus di diffusione dell’oggetto: aggiungere o aggiornare gli oggetti di scena clonati

Un vantaggio immediato dell’uso della diffusione dell’oggetto è che è possibile aggiornare o aggiungere nuove proprietà all’oggetto clonato sul posto, se ne avete bisogno.

Cloniamo l’oggetto hero, ma aggiorniamo la proprietà name ad un valore diverso e aggiungiamo una nuova proprietà realName:

const hero = { name: 'Batman', city: 'Gotham'};const heroEnhancedClone = { ...hero, name: 'Batman Clone', realName: 'Bruce Wayne'};heroEnhancedClone; // { name: 'Batman Clone', city: 'Gotham', realName: 'Bruce Wayne' }

2. Clonare usando l’object rest

Un altro buon modo per clonare gli oggetti in modo superficiale è usando l’operatore object rest:

const { ...clone } = object;

Ancora una volta, usiamo l’operatore rest per fare una copia dell’oggetto hero:

const hero = { name: 'Batman', city: 'Gotham'};const { ...heroClone } = hero;heroClone; // { name: 'Batman', city: 'Gotham' }hero === heroClone; // => false

Dopo aver applicato l’operatore rest const { ...heroClone } = hero, la variabile heroClone contiene una copia dell’oggetto hero.

2.1 Bonus di Object Rest: saltare gli oggetti di scena clonati

Un bel bonus quando si usa Object Rest è la possibilità di saltare certe proprietà quando si clona.

Per esempio, creiamo un clone dell’oggetto hero, ma saltiamo la proprietà city nel clone:

const hero = { name: 'Batman', city: 'Gotham'};const { city, ...heroClone } = hero;heroClone; // { name: 'Batman' }

2.2 Super bonus: combinare object spread e rest

Object spread porta il bonus di aggiornare o aggiungere nuove proprietà, mentre object rest ha il vantaggio di saltare le proprietà nel clone risultante.

Si possono combinare object spread e rest in un’unica dichiarazione per ereditare tutti questi benefici? Sì, è possibile!

Cloniamo l’oggetto hero, aggiungendo anche una nuova proprietà realName e saltando la proprietà city:

const hero = { name: 'Batman', city: 'Gotham'};const { city, ...heroClone } = { ...hero, realName: 'Bruce Wayne'};heroClone; // { name: 'Batman', realName: 'Bruce Wayne' }

Combinare la diffusione degli oggetti e il resto per clonare gli oggetti ed eseguire la manipolazione delle proprietà in un’unica dichiarazione è fantastico!

3. Clonare usando Object.assign()

Infine, Object.assign(target, ...sources) permette di eseguire la stessa clonazione di oggetti:

const clone = Object.assign({}, object);

Utilizziamo Object.assign() in pratica e creiamo un oggetto clone di hero oggetto:

const hero = { name: 'Batman', city: 'Gotham'};const heroClone = Object.assign({}, hero);heroClone; // { name: 'Batman', city: 'Gotham' }hero === heroClone; // => false

Object.assign({}, hero) crea un clone di hero fondendo il secondo argomento hero nel primo argomento {}.

3.1 Bonus Object.assign(): aggiungere o aggiornare gli oggetti di scena clonati

Object.assign() permette anche di aggiornare o aggiungere nuove proprietà al clone.

Copiamo l’oggetto hero, ma allo stesso tempo aggiorniamo la proprietà name:

const hero = { name: 'Batman', city: 'Gotham'};const heroClone = Object.assign({}, hero, { name: 'Batman Clone' });heroClone; // { name: 'Batman Clone', city: 'Gotham' }

Object.assign({}, hero, { name: 'Batman Clone' }) crea l’oggetto in 2 passi.

Prima, il secondo argomento hero è fuso nel primo argomento {}. Questo equivale a { name: 'Batman', city: 'Gotham' }.

In secondo luogo, il terzo argomento { name: 'Batman Clone' } viene fuso nel risultato del passo precedente, sovrascrivendo la proprietà name. Infine, si ottiene l’oggetto { name: 'Batman Clone', city: 'Gotham' }.

4. Riassunto

JavaScript fornisce 3 buoni modi per clonare oggetti: usando l’operatore spread, l’operatore rest e la funzione Object.assign().

Oltre a clonare semplicemente gli oggetti, l’utilizzo dell’operatore spread e Object.assign() permette di aggiungere o aggiornare le proprietà durante la creazione del clone.

L’operatore Rest dà anche il vantaggio di saltare alcune proprietà durante la clonazione.

E la cosa grandiosa è che si possono combinare la diffusione dell’oggetto e il rest in una singola dichiarazione, in modo da poter clonare l’oggetto, e allo stesso tempo aggiungere, aggiornare o saltare le proprietà dall’essere clonato.

Questo è utile se volete abbracciare l’immutabilità ed essere in grado di manipolare le proprietà dell’oggetto clonato sul posto.

Quali altri buoni modi per clonare oggetti in JavaScript conoscete?

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *