Manipulation de tableaux, copie et référence

On imagine le tableau suivant:

const elements = ["Azote", "Bore", "Cuivre", "Dubnium", "Europium", "Fer"]

J'aimerais copier ce tableau.

const duplicate = elements

Tout va bien. Je souhaite remplacer dans "duplicate" le "Dubnium" par "Dora l'Exploratrice".

duplicate[3] = "Dora l'Exploratrice"

J'affiche les tableaux.

console.log(elements)
console.log(duplicate)

En fait, avec const duplicate = elements, j'ai créé un alias de elements nommé duplicate. Si je modifie l'un d'eux, l'autre sera également modifié. C'est comme si je disais x = 4 ; puis y = x. En changeant y, je change x et vice-versa.

Mais comment copier un tableau sans que ça ne modifie tout ?

Travailler avec des tableaux

Array.slice()

Un elements.slice() est suffisant.

Array.concat

[].concat(elements) copie le contenu de elements dans un nouveau tableau vierge.

Spread operator

Ce sont les 3 points magiques qui permettent de dupliquer un tableau.

[...elements]

Array.from()

Transforme l'argument en tableau. C'est utile quand nous travaillons sur un Set, pour enlever les doublons.

Manipulation d'objets

On peut faire à peu près la même chose pour les objets.

On imagine l'objet suivant:

const hero = {name: "Argh", hp: 1870}

Tout comme pour les tableaux, je ne peux pas référencer "hero" pour créer un autre objet et modifier une clé de celui-ci sans que ça ne se répercute sur l'objet initial !

Object.assign({})

Assign exige 3 paramètres: un objet (vide ou pas), l'objet cible, et un objet avec les propriétés à rajouter.

const duplicate = Object.assign({}, hero, {atk: 119})

Spread operator, échec

Ne marche que pour les tableaux, pas pour les objets !

const duplicate = {...hero} provoquera une erreur...

Pour des objets avec plusieurs niveaux

JSON.parse(JSON.stringify(hero))