Décomposition et déstructuration

La décomposition est le moyen de transformer un itérable (tableau, objet...) en suite d'arguments.

La déstructuration est le moyen d'extraire des données d'un itérable à l'aide d'une syntaxe ciurte.

DéfinitionDécomposition

L'opérateur de décomposition Spread ... permet de transformer un tableau en liste d'arguments.

1
const tab1 = [1, 2, 3];
2
const tab2 = [4, 5, 6];
3
const tab3 = [...tab1, 4]; // [1, 2, 3, 4]
4
const tab4 = [...tab1, ...tab2]; // [1, 2, 3, 4, 5, 6]
5
const tab5 = [0, ...tab1, 4]; // [0, 1, 2, 3, 4]

ExempleEnvoyer une variable décomposée

1
const somme = (a, b, c) => a+b+c;
2
const somme1 = somme(1, 2, 3); // 6  
3
const somme2 = somme(...[1, 2, 3]); // 6 
4
const tab = [1,2,3];
5
const somme3 = somme(...tab); // 6 
6

ExempleArgument décomposé

La décomposition peut être utilisée comme argument de fonction.

On dit que l'on utilise les paramètres du reste rest parameters (...).

Ce qui permet de créer une fonction avec un nombre d'arguments indéterminé.

L'argument est utilisé comme un tableau à l'intérieur de la fonction.

1
const somme = function(...nombres) {
2
  let s=0;
3
  for(let valeur of nombres) {
4
    s = s + valeur;
5
  }
6
  return s;
7
}
8
const somme1 = somme(1, 2, 3); // 6  
9
const somme2 = somme(1, 2, 3, 4); // 10  
10
const somme3 = somme(...[1, 2, 3]); // 6  
11
const somme4 = somme(...[1, 2, 3], 4); // 10

nombres est un tableau qui contient tous les paramètres entrés.

Simplification

Avec une fonction fléchée et la méthode reduce de tableau :

1
const somme = (...nombres) => nombres.reduce((s, x) => s+x, 0);
2
const somme1 = somme(1, 2, 3); // 6  
3
const somme2 = somme(1, 2, 3, 4); // 10  
4
const somme3 = somme(...[1, 2, 3]); // 6  
5
const somme4 = somme(...[1, 2, 3], 4); // 10

DéfinitionDéstructuration (Affectation par décomposition)

L'affectation par décomposition permet d'affecter le contenu de plusieurs variables sous la forme d'une écriture de tableau.

1
const [a, b, c] = [1, 2, 3]; // a=1, b=2, c=3
2
const [d, e, f, ...reste] = [1, 2, 3, 4, 5]; // d=1, e=2, f=3, reste = [4,5]

Ignorer des valeurs

1
const tab = [1, 2, 3];
2
const [a,,b] = tab; // a=1, b=3

Valeur par défaut

1
const tab = [1, 2];
2
const [a, b=3, c=4] = tab; // a=1, b=2, c=4

Échange de valeurs

1
let a=1, b=2;
2
[a, b] = [b, a]; // a=2, b=1

L'affectation par décomposition fonctionne aussi pour les objets.

Les clés deviennent des variables :

1
const obj = {id: 1, nom: 'dupont', prenom: 'jean', age: 30};
2
const {nom, prenom, ...reste} = obj; // nom='dupont', prenom='jean', reste={id: 1, age: 30}

On peut utiliser un alias pour les clés

1
const obj = {id: 1, nom: 'dupont', prenom: 'jean', age: 30};
2
const {nom: a, prenom: b, ...reste} = obj; // a='dupont', b='jean', reste={id: 1, age: 30}

On peut combiner

1
const tab = [{id: 1, age: 30},{id: 4, age: 20},{id: 5, age: 25}];
2
const [fiche,{id: identifiant},{age}] = tab; // fiche={id: 1, age: 30}, identifiant=4, age=25

ExempleArgument déstructuré

Argument tableau :

1
const afficher = function([nom, prenom, age]) {  
2
  return `${nom} ${prenom} a ${age}ans`;
3
}
4
const personne = ['Dupont', 'Paul', '30'];  
5
console.log(afficher(personne)); // Dupont Paul a 30ans  

Argument objet :

1
const afficher = function({nom, prenom, age}) {  
2
  return `${nom} ${prenom} a ${age}ans`;
3
}
4
const personne = {nom:'Dupont', prenom:'Paul', age:'30'}  
5
console.log(afficher(personne)); // Dupont Paul a 30ans  

Argument combiné :

1
const afficher = function([{nom: n1, prenom: p1, age: a1},{nom: n2, prenom: p2, age: a2}]) { 
2
  return `${n1} ${p1} a ${a1}ans et ${n2} ${p2} a ${a2}ans`;
3
}
4
const personnes = [{nom:'Dupont', prenom:'Paul', age:'30'},{nom:'Dupuis', prenom:'Jean', age:'70'}]; 
5
console.log(afficher(personnes)); // Dupont Paul a 30ans  

Exemple de tri :

1
const personnes = [
2
    { nom: 'Dupont', prenom: 'Paul', age: '30' },
3
    { nom: 'Dupuis', prenom: 'Jean', age: '70' },
4
    { nom: 'Durant', prenom: 'Pierre', age: '40' },
5
];
6
personnes.sort(({ age: a }, { age: b }) => a - b);
7
console.log(personnes); // affiche le tableau dans l'ordre croissant