Module 2 : JavaScript

Les tableaux

Manipulez des listes de données, parcourez-les avec les méthodes modernes (map, filter, reduce).

45 min
Version Audio
Intermédiaire
📊

LES TABLEAUX EN JAVASCRIPT

Version Ultra-Détaillée - Définitions & Explications Complètes

📖 1. INTRODUCTION AUX TABLEAUX

Définition : Un tableau (Array) est une structure de données qui permet de stocker une collection ordonnée d'éléments. Chaque élément est identifié par un index (position) commençant à 0.

Métaphore : Un tableau est comme une liste de courses :

  • Chaque élément est un article dans la liste.
  • Les articles sont numérotés (0, 1, 2, ...).
  • On peut ajouter des articles, supprimer des articles, ou modifier leur position.

Pourquoi les tableaux sont-ils importants ?

  • Ils permettent de stocker et organiser des collections de données.
  • Ils offrent des méthodes puissantes pour manipuler les données.
  • Ils sont partout en JavaScript (API, DOM, algorithmes).

🛠️ 2. CRÉATION DE TABLEAUX

2.1 Littéral de Tableau

Définition : Le littéral de tableau est la façon la plus simple et la plus courante de créer un tableau. On utilise des crochets [ ].

// Tableau vide

const vide = [];

// Tableau de nombres

const nombres = [1, 2, 3, 4, 5];

// Tableau de chaînes

const fruits = ["pomme", "banane", "orange"];

// Tableau mixte (différents types)

const mixte = [42, "texte", true, { nom: "Jean" }];

// Tableau de tableaux (matrice)

const matrice = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ];

2.2 Constructeur Array()

Définition : On peut créer un tableau en utilisant le constructeur new Array(). Attention au comportement particulier avec un seul argument numérique.

// Tableau avec des éléments

const fruits = new Array("pomme", "banane", "orange");

// ⚠️ Piège : avec un seul nombre, cela crée un tableau de cette longueur

const longueur = new Array(5); // [empty x 5] (5 emplacements vides)

// Avec plusieurs arguments, cela crée un tableau avec ces valeurs

const avecValeurs = new Array(1, 2, 3); // [1, 2, 3]

Recommandation : Utilisez toujours le littéral [ ] pour créer des tableaux. C'est plus clair et évite les pièges du constructeur.

2.3 Array.from()

Définition : Array.from() est une méthode statique qui crée un tableau à partir d'un itérable ou d'un objet semblable à un tableau.

// Depuis une chaîne de caractères

const lettres = Array.from("Bonjour");

console.log(lettres); // ["B", "o", "n", "j", "o", "u", "r"]

// Avec une fonction de transformation (map)

const carres = Array.from([1, 2, 3, 4], x => x * x);

console.log(carres); // [1, 4, 9, 16]

// Créer un tableau de 5 éléments (1 à 5)

const nombres = Array.from({ length: 5 }, (_, i) => i + 1);

console.log(nombres); // [1, 2, 3, 4, 5]

🔍 3. ACCÈS ET MANIPULATION DE BASE

3.1 Accès aux Éléments

Définition : On accède à un élément d'un tableau en utilisant son index (position) entre crochets. L'index commence à 0.

const fruits = ["pomme", "banane", "orange", "kiwi"];

console.log(fruits[0]); // "pomme" (premier élément)

console.log(fruits[2]); // "orange" (troisième élément)

console.log(fruits[fruits.length - 1]); // "kiwi" (dernier élément)

console.log(fruits[10]); // undefined (index hors limites)

3.2 Propriété length

Définition : La propriété length retourne le nombre d'éléments dans le tableau. Elle peut aussi être modifiée pour tronquer ou agrandir un tableau.

const fruits = ["pomme", "banane", "orange"];

console.log(fruits.length); // 3

// Tronquer le tableau

fruits.length = 2;

console.log(fruits); // ["pomme", "banane"]

3.3 Ajouter des Éléments

Méthodes :

  • push() : Ajoute un ou plusieurs éléments à la fin du tableau.
  • unshift() : Ajoute un ou plusieurs éléments au début du tableau.

const fruits = ["pomme", "banane"];

// push() - ajoute à la fin

fruits.push("orange");

console.log(fruits); // ["pomme", "banane", "orange"]

// push() retourne la nouvelle longueur

const nouvelleLongueur = fruits.push("kiwi");

console.log(nouvelleLongueur); // 4

// unshift() - ajoute au début

fruits.unshift("fraise");

console.log(fruits); // ["fraise", "pomme", "banane", "orange", "kiwi"]

3.4 Supprimer des Éléments

Méthodes :

  • pop() : Supprime le dernier élément et le retourne.
  • shift() : Supprime le premier élément et le retourne.

const fruits = ["pomme", "banane", "orange"];

// pop() - supprime le dernier élément

const dernier = fruits.pop();

console.log(dernier); // "orange"

console.log(fruits); // ["pomme", "banane"]

// shift() - supprime le premier élément

const premier = fruits.shift();

console.log(premier); // "pomme"

console.log(fruits); // ["banane"]

3.5 splice() - Ajouter/Supprimer/Remplacer

Définition : splice() est une méthode polyvalente qui permet d'ajouter, de supprimer ou de remplacer des éléments à n'importe quelle position.

Syntaxe : array.splice(start, deleteCount, ...items)

  • start : Index de départ.
  • deleteCount : Nombre d'éléments à supprimer.
  • ...items : Éléments à ajouter (optionnel).

const fruits = ["pomme", "banane", "orange", "kiwi"];

// Supprimer 2 éléments à partir de l'index 1

const supprime = fruits.splice(1, 2);

console.log(supprime); // ["banane", "orange"]

console.log(fruits); // ["pomme", "kiwi"]

// Ajouter des éléments à l'index 1

fruits.splice(1, 0, "fraise", "mangue");

console.log(fruits); // ["pomme", "fraise", "mangue", "kiwi"]

// Remplacer à l'index 1

fruits.splice(1, 1, "cerise");

console.log(fruits); // ["pomme", "cerise", "mangue", "kiwi"]

3.6 slice() - Extraire une Partie

Définition : slice() retourne une copie superficielle d'une portion du tableau, sans modifier l'original.

Syntaxe : array.slice(start, end)

const fruits = ["pomme", "banane", "orange", "kiwi", "mangue"];

// Extraire les éléments de l'index 1 à 3 (exclu)

const sousTableau = fruits.slice(1, 4);

console.log(sousTableau); // ["banane", "orange", "kiwi"]

// Indices négatifs (à partir de la fin)

const derniers = fruits.slice(-2);

console.log(derniers); // ["kiwi", "mangue"]

// Copie complète du tableau

const copie = fruits.slice();

console.log(copie); // ["pomme", "banane", "orange", "kiwi", "mangue"]

🔄 4. MÉTHODES DE PARCOURS (ITÉRATION)

Définition : Les méthodes d'itération permettent de parcourir tous les éléments d'un tableau et d'appliquer une fonction à chaque élément. Ces méthodes sont modernes, puissantes et expriment clairement l'intention du code.

Métaphore : Ces méthodes sont comme des tapas roulantes dans une usine : chaque élément passe sur la tapis, subit une transformation (ou un contrôle), et sort de l'autre côté.

4.1 forEach() - Exécuter une Action

Définition : forEach() exécute une fonction sur chaque élément du tableau. Il ne retourne rien (undefined). On l'utilise pour des effets de bord (afficher, modifier une variable externe, etc.).

const fruits = ["pomme", "banane", "orange"];

// Afficher chaque fruit

fruits.forEach(function(fruit) { console.log(fruit); });

// Affiche : "pomme", "banane", "orange"

// Avec fonction fléchée + index

fruits.forEach((fruit, index) => { console.log(`${index}: ${fruit}`); });

// Affiche : "0: pomme", "1: banane", "2: orange"

⚠️ Attention : forEach() ne peut pas être arrêté avec break (contrairement à la boucle for). Utilisez some() ou every() si vous avez besoin de sortir prématurément.

4.2 map() - Transformer Chaque Élément

Définition : map() crée un nouveau tableau en appliquant une transformation à chaque élément du tableau d'origine. Le tableau original n'est pas modifié.

Métaphore : map() est comme une machine à peindre : vous mettez des pommes d'un côté, elle les peint en rouge, et des pommes rouges sortent de l'autre côté.

const nombres = [1, 2, 3, 4];

// Doubler chaque nombre

const doubles = nombres.map(n => n * 2);

console.log(doubles); // [2, 4, 6, 8]

console.log(nombres); // [1, 2, 3, 4] (original inchangé)

// Transformer des objets

const personnes = [ { nom: "Jean", age: 30 }, { nom: "Marie", age: 25 } ];

const noms = personnes.map(p => p.nom);

console.log(noms); // ["Jean", "Marie"]

4.3 filter() - Filtrer les Éléments

Définition : filter() crée un nouveau tableau contenant uniquement les éléments qui satisfont une condition (fonction retournant true). Le tableau original n'est pas modifié.

Métaphore : filter() est comme un tamis : vous versez un mélange, seuls les éléments qui répondent au critère passent à travers.

const nombres = [1, 2, 3, 4, 5, 6];

// Filtrer les nombres pairs

const pairs = nombres.filter(n => n % 2 === 0);

console.log(pairs); // [2, 4, 6]

// Filtrer des objets

const personnes = [ { nom: "Jean", age: 30 }, { nom: "Marie", age: 17 }, { nom: "Pierre", age: 25 } ];

const adultes = personnes.filter(p => p.age >= 18);

console.log(adultes); // [{nom: "Jean", age: 30}, {nom: "Pierre", age: 25}]

4.4 reduce() - Réduire à une Seule Valeur

Définition : reduce() est une méthode puissante qui réduit un tableau à une seule valeur (somme, produit, concaténation, etc.) en appliquant une fonction cumulativement.

Syntaxe : array.reduce((accumulateur, valeurCourante) => ..., valeurInitiale)

  • accumulateur : La valeur accumulée à chaque étape.
  • valeurCourante : L'élément actuel du tableau.
  • valeurInitiale : La valeur de départ de l'accumulateur.

const nombres = [1, 2, 3, 4];

// Somme des nombres

const somme = nombres.reduce((acc, n) => acc + n, 0);

console.log(somme); // 10

// Produit des nombres

const produit = nombres.reduce((acc, n) => acc * n, 1);

console.log(produit); // 24

// Concaténer des chaînes

const fruits = ["pomme", "banane", "orange"];

const phrase = fruits.reduce((acc, fruit, index) => { if (index === 0) return fruit; return acc + ", " + fruit; });

console.log(phrase); // "pomme, banane, orange"

// Compter les occurrences

const mots = ["a", "b", "a", "c", "b", "a"];

const compteur = mots.reduce((acc, mot) => { acc[mot] = (acc[mot] || 0) + 1; return acc; }, {});

console.log(compteur); // { a: 3, b: 2, c: 1 }

4.5 some() et every() - Vérifier des Conditions

Définitions :

  • some() : Retourne true si au moins un élément satisfait la condition.
  • every() : Retourne true si tous les éléments satisfont la condition.

const nombres = [1, 2, 3, 4, 5];

// some() - y a-t-il un nombre pair ?

const aPair = nombres.some(n => n % 2 === 0);

console.log(aPair); // true

// every() - tous les nombres sont-ils positifs ?

const tousPositifs = nombres.every(n => n > 0);

console.log(tousPositifs); // true

// every() - tous les nombres sont-ils pairs ?

const tousPairs = nombres.every(n => n % 2 === 0);

console.log(tousPairs); // false

4.6 find() et findIndex() - Trouver un Élément

Définitions :

  • find() : Retourne le premier élément qui satisfait la condition, ou undefined.
  • findIndex() : Retourne l'index du premier élément qui satisfait la condition, ou -1.

const personnes = [ { nom: "Jean", age: 30 }, { nom: "Marie", age: 17 }, { nom: "Pierre", age: 25 } ];

// find() - trouver la première personne majeure

const majeur = personnes.find(p => p.age >= 18);

console.log(majeur); // {nom: "Jean", age: 30}

// findIndex() - trouver l'index de la première personne majeure

const index = personnes.findIndex(p => p.age >= 18);

console.log(index); // 0

4.7 includes() - Vérifier la Présence

Définition : includes() vérifie si un tableau contient une valeur spécifique. Retourne true ou false.

const fruits = ["pomme", "banane", "orange"];

console.log(fruits.includes("banane")); // true

console.log(fruits.includes("kiwi")); // false

console.log(fruits.includes("banane", 2)); // false (recherche à partir de l'index 2)

4.8 sort() - Trier les Éléments

Définition : sort() trie les éléments du tableau en place (modifie le tableau original) et retourne le tableau trié.

⚠️ Attention : Par défaut, sort() convertit les éléments en chaînes et les trie comme des textes. Cela peut donner des résultats surprenants avec des nombres.

const nombres = [3, 1, 4, 1, 5, 9];

// ❌ Tri par défaut (comme des chaînes)

nombres.sort();

console.log(nombres); // [1, 1, 3, 4, 5, 9] (ça marche ici par hasard)

// ✅ Tri numérique (fonction de comparaison)

const nombres2 = [10, 2, 30, 4];

nombres2.sort((a, b) => a - b);

console.log(nombres2); // [2, 4, 10, 30] (ascendant)

nombres2.sort((a, b) => b - a);

console.log(nombres2); // [30, 10, 4, 2] (descendant)

// Trier des objets

const personnes = [ { nom: "Jean", age: 30 }, { nom: "Marie", age: 25 }, { nom: "Pierre", age: 35 } ];

personnes.sort((a, b) => a.age - b.age);

console.log(personnes);

// [ {nom: "Marie", age: 25}, {nom: "Jean", age: 30}, {nom: "Pierre", age: 35} ]

⛓️ 5. CHAÎNAGE DE MÉTHODES

Définition : Le chaînage de méthodes consiste à enchaîner plusieurs méthodes sur un tableau, car chaque méthode retourne un tableau (ou une valeur) sur lequel on peut appliquer la méthode suivante.

Métaphore : C'est comme une chaîne de montage : chaque étape transforme le produit et le passe à l'étape suivante.

const nombres = [1, 2, 3, 4, 5, 6, 7, 8];

// Exemple : filtrer les pairs, doubler, puis sommer

const resultat = nombres .filter(n => n % 2 === 0) // [2, 4, 6, 8] .map(n => n * 2) // [4, 8, 12, 16] .reduce((acc, n) => acc + n, 0); // 40

console.log(resultat); // 40

// Exemple avec des objets

const personnes = [ { nom: "Jean", age: 30 }, { nom: "Marie", age: 17 }, { nom: "Pierre", age: 25 }, { nom: "Sophie", age: 19 } ];

const nomsAdultes = personnes .filter(p => p.age >= 18) .map(p => p.nom) .sort();

console.log(nomsAdultes); // ["Jean", "Pierre", "Sophie"]

📊 6. RÉSUMÉ - LES TABLEAUX

Méthode Description Retour Modifie original
push() Ajoute à la fin Nouvelle longueur ✅ Oui
pop() Supprime le dernier Élément supprimé ✅ Oui
unshift() Ajoute au début Nouvelle longueur ✅ Oui
shift() Supprime le premier Élément supprimé ✅ Oui
splice() Ajoute/Supprime/Remplace Éléments supprimés ✅ Oui
slice() Extrait une portion Nouveau tableau ❌ Non
forEach() Exécute une action undefined ❌ Non
map() Transforme chaque élément Nouveau tableau ❌ Non
filter() Filtre les éléments Nouveau tableau ❌ Non
reduce() Réduit à une valeur Valeur accumulée ❌ Non
some() Vérifie si un élément correspond boolean ❌ Non
every() Vérifie si tous correspondent boolean ❌ Non
find() Trouve un élément Premier élément / undefined ❌ Non
findIndex() Trouve l'index d'un élément Index / -1 ❌ Non
includes() Vérifie la présence boolean ❌ Non
sort() Trie le tableau Tableau trié ✅ Oui

┌─────────────────────────────────────────────────────────────────┐

│ TABLEAUX - RÉCAPITULATIF │

│ │

│ ┌─────────────────────────────────────────────────────────┐ │

│ │ CRÉATION │ │

│ │ [ ] → new Array() → Array.from() │ │

│ └─────────────────────────────────────────────────────────┘ │

│ │

│ ┌─────────────────────────────────────────────────────────┐ │

│ │ MODIFICATION │ │

│ │ push/pop (fin) → unshift/shift (début) → splice │ │

│ └─────────────────────────────────────────────────────────┘ │

│ │

│ ┌─────────────────────────────────────────────────────────┐ │

│ │ LECTURE │ │

│ │ [index] → length → slice │ │

│ └─────────────────────────────────────────────────────────┘ │

│ │

│ ┌─────────────────────────────────────────────────────────┐ │

│ │ ITÉRATION │ │

│ │ forEach → map → filter → reduce │ │

│ │ some → every → find → findIndex │ │

│ └─────────────────────────────────────────────────────────┘ │

│ │

│ ┌─────────────────────────────────────────────────────────┐ │

│ │ CHAÎNAGE │ │

│ │ array.filter().map().reduce() → résultat final │ │

│ └─────────────────────────────────────────────────────────┘ │

└─────────────────────────────────────────────────────────────────┘