0%
JavaScript Moderne : Destructuring et Spread

Destructuring

Manipulation moderne des données

10-15 min

JavaScript Moderne : Destructuring et Spread Operator

Le destructuring (déstructuration) et le spread operator (opérateur de décomposition) sont deux fonctionnalités puissantes introduites avec ES6 qui simplifient considérablement la manipulation des tableaux et des objets en JavaScript.

Le Destructuring

La déstructuration permet d’extraire des valeurs d’objets ou de tableaux et de les assigner à des variables distinctes de manière concise.

Destructuring d’objets

// Destructuring d'objet simple
const personne = {
    nom: "Dupont",
    prenom: "Marie",
    age: 30
};

const { nom, prenom, age } = personne;
console.log(nom);    // "Dupont"
console.log(prenom); // "Marie"
console.log(age);    // 30

// Avec des noms de variables différents
const { nom: nomFamille, prenom: prenomPersonne } = personne;
console.log(nomFamille);     // "Dupont"
console.log(prenomPersonne); // "Marie"

// Avec des valeurs par défaut
const { pays = "France", ville = "Paris" } = personne;
console.log(pays);  // "France" (valeur par défaut)
console.log(ville); // "Paris" (valeur par défaut)

Destructuring imbriqué

const utilisateur = {
    id: 1,
    infos: {
        nom: "Dupont",
        adresse: {
            rue: "123 rue Principale",
            ville: "Paris"
        }
    }
};

// Destructuring imbriqué
const { infos: { nom, adresse: { ville } } } = utilisateur;
console.log(nom);   // "Dupont"
console.log(ville); // "Paris"

Destructuring de tableaux

// Destructuring de tableau basique
const couleurs = ["rouge", "vert", "bleu"];
const [premiere, deuxieme, troisieme] = couleurs;
console.log(premiere);  // "rouge"
console.log(deuxieme); // "vert"
console.log(troisieme); // "bleu"

// Ignorer certains éléments
const [,, derniere] = couleurs;
console.log(derniere); // "bleu"

// Avec valeur par défaut
const [a, b, c, d = "jaune"] = couleurs;
console.log(d); // "jaune"

// Rest pattern avec tableaux
const [premier, ...reste] = couleurs;
console.log(premier); // "rouge"
console.log(reste);   // ["vert", "bleu"]

Destructuring dans les paramètres de fonction

// Destructuring dans les paramètres
function afficherUtilisateur({ nom, age, email = "non fourni" }) {
    console.log(`Nom: ${nom}, Age: ${age}, Email: ${email}`);
}

afficherUtilisateur({
    nom: "Dupont",
    age: 30
}); // "Nom: Dupont, Age: 30, Email: non fourni"

// Avec tableau
function afficherCoordonnees([x, y, z = 0]) {
    console.log(`X: ${x}, Y: ${y}, Z: ${z}`);
}

afficherCoordonnees([10, 20]); // "X: 10, Y: 20, Z: 0"

Le Spread Operator

L’opérateur spread (...) permet de décomposer un itérable (comme un tableau ou une chaîne) en ses éléments individuels.

Avec les tableaux

// Copie de tableau
const original = [1, 2, 3];
const copie = [...original];
console.log(copie); // [1, 2, 3]

// Concaténation de tableaux
const tableau1 = [1, 2];
const tableau2 = [3, 4];
const combine = [...tableau1, ...tableau2];
console.log(combine); // [1, 2, 3, 4]

// Ajouter des éléments
const nombres = [1, 2, 3];
const plusNombres = [...nombres, 4, 5];
console.log(plusNombres); // [1, 2, 3, 4, 5]

// Dans les appels de fonction
function somme(x, y, z) {
    return x + y + z;
}

const nombres2 = [1, 2, 3];
console.log(somme(...nombres2)); // 6

Avec les objets (Object Spread)

// Copie d'objet
const original = { a: 1, b: 2 };
const copie = { ...original };
console.log(copie); // { a: 1, b: 2 }

// Fusion d'objets
const obj1 = { foo: "bar", x: 42 };
const obj2 = { foo: "baz", y: 13 };
const cloned = { ...obj1 }; // { foo: "bar", x: 42 }
const merged = { ...obj1, ...obj2 }; // { foo: "baz", x: 42, y: 13 }

// Ajout/écrasement de propriétés
const base = { a: 1, b: 2 };
const nouveau = { ...base, b: 3, c: 4 };
console.log(nouveau); // { a: 1, b: 3, c: 4 }

Cas d’utilisation avancés

// Avec les chaînes de caractères
const str = "Hello";
const chars = [...str];
console.log(chars); // ["H", "e", "l", "l", "o"]

// Dans les constructions de tableaux
const parts = ["épaules", "genoux"];
const corps = ["tête", ...parts, "orteils"];
console.log(corps); // ["tête", "épaules", "genoux", "orteils"]

// Avec Set
const monSet = new Set([1, 2, 3]);
const tableau = [...monSet];
console.log(tableau); // [1, 2, 3]

// Combiner destructuring et spread
const { a, b, ...reste } = { a: 1, b: 2, c: 3, d: 4 };
console.log(a);     // 1
console.log(b);     // 2
console.log(reste); // { c: 3, d: 4 }

Patterns et bonnes pratiques

Pattern de renommage avec destructuring

// Renommer lors du destructuring
const api = {
    user_id: 123,
    user_name: "john_doe",
    user_email: "john@example.com"
};

const {
    user_id: id,
    user_name: username,
    user_email: email
} = api;

console.log(id);       // 123
console.log(username); // "john_doe"

Paramètres par défaut avec destructuring

function configurer({
    couleur = "bleu",
    taille = "medium",
    type = "normal"
} = {}) {
    console.log(`Couleur: ${couleur}, Taille: ${taille}, Type: ${type}`);
}

configurer(); // Utilise toutes les valeurs par défaut
configurer({ couleur: "rouge" }); // Surcharge uniquement la couleur

Copie profonde vs superficielle

// Attention : spread fait une copie superficielle
const original = { 
    a: 1, 
    b: { 
        c: 2 
    } 
};

const copieSuperf = { ...original };
copieSuperf.b.c = 3;
console.log(original.b.c); // 3 (l'objet imbriqué est partagé)

// Pour une copie profonde, utilisez :
const copieProf = JSON.parse(JSON.stringify(original));
// Ou utilisez des bibliothèques comme lodash.cloneDeep

Combinaison avec d’autres fonctionnalités ES6+

// Avec les template literals
const personne = {
    nom: "Alice",
    competences: ["JS", "React", "Node"]
};

const { nom, competences: [principale, ...autres] } = personne;
console.log(`${nom} maîtrise principalement ${principale}`);
// "Alice maîtrise principalement JS"

// Avec les fonctions fléchées
const creerUtilisateur = ({ nom, age }) => ({
    nom,
    age,
    dateCreation: new Date()
});

const utilisateur = creerUtilisateur({ nom: "Bob", age: 25 });

Cas d’utilisation pratiques

Dans React

// Destructuring des props
function UserProfile({ name, age, email }) {
    return (
        <div>
            <h2>{name}</h2>
            <p>Age: {age}</p>
            <p>Email: {email}</p>
        </div>
    );
}

// Spread avec les props
const buttonProps = {
    type: "submit",
    className: "btn-primary",
    onClick: () => console.log("Cliqué!")
};

<button {...buttonProps}>Envoyer</button>

Dans les API REST

// Extraction de données d'une réponse API
async function getUser(id) {
    const response = await fetch(`/api/users/${id}`);
    const { name, email, ...metadata } = await response.json();
    
    return {
        displayName: name,
        contact: email,
        metadata
    };
}

// Construction de requête
const defaultParams = {
    method: "GET",
    headers: {
        "Content-Type": "application/json"
    }
};

const fetchData = (url, options) => 
    fetch(url, { ...defaultParams, ...options });

Exercices pratiques

  1. Extraction de données
// Exercice : Extraire les informations pertinentes
const donnees = {
    utilisateur: {
        nom: "Dupont",
        adresse: {
            rue: "123 rue Principale",
            ville: "Paris",
            pays: "France"
        },
        preferences: {
            theme: "sombre",
            notifications: true
        }
    }
};

// Solution
const { 
    utilisateur: { 
        nom,
        adresse: { ville },
        preferences: { theme }
    }
} = donnees;

console.log(`${nom} vit à ${ville} et préfère le thème ${theme}`);
  1. Fusion d’objets
// Exercice : Fusionner des configurations
const configDefaut = {
    theme: "clair",
    langue: "fr",
    notifications: true
};

const configUtilisateur = {
    theme: "sombre",
    notifications: false
};

// Solution
const configFinale = { ...configDefaut, ...configUtilisateur };
console.log(configFinale);
// { theme: "sombre", langue: "fr", notifications: false }
  1. Manipulation de tableaux
// Exercice : Réorganiser un tableau
const nombres = [1, 2, 3, 4, 5];

// Solution
const [premier, deuxieme, ...autres] = nombres;
const reorganise = [...autres, deuxieme, premier];
console.log(reorganise); // [3, 4, 5, 2, 1]

Conclusion

Le destructuring et le spread operator sont des outils essentiels du JavaScript moderne qui permettent :

  • D’extraire facilement des données de structures complexes
  • De créer des copies d’objets et de tableaux
  • De fusionner des données de manière élégante
  • De rendre le code plus lisible et maintenable

Ces fonctionnalités sont particulièrement utiles dans :

  • La manipulation de données d’API
  • Le développement React/Vue.js
  • La gestion d’état d’application
  • Le traitement de configurations

Dans le prochain tutoriel, nous explorerons la programmation orientée objet en JavaScript moderne.


Besoin de revoir les fonctions ? Consultez notre tutoriel précédent sur les fonctions.

Prêt à continuer ? Passez au prochain tutoriel sur la POO.

Commentaires

Les commentaires sont alimentés par GitHub Discussions

Connectez-vous avec GitHub pour participer à la discussion

Lien copié !