📊 Le cours : travailler sur des listes
Un tableau JavaScript est ce que Python appelle une liste : ordonné, de taille variable, et ses éléments peuvent être de types différents. Les notions générales (indices, parcours, copies) sont celles du chapitre Tableaux 1D ; ici, voici leur version JavaScript.
Lire et sortir des limites
Contrairement au C ou à Java, lire un indice qui n'existe pas ne provoque aucune erreur : on obtient undefined. Et écrire à un indice supérieur à la taille agrandit le tableau en laissant des « trous ». t.at(-1) donne le dernier élément (les indices négatifs sont acceptés par at).
const t = ["a", "b", "c"];
console.log(t[5], t.at(-1), t.length);
t[5] = "f";
console.log(t.length);
Ajouter et retirer
| Méthode | Effet | Modifie le tableau ? |
push(x) pop() | ajoute / retire à la fin (renvoie la nouvelle taille / l'élément retiré) | oui |
unshift(x) shift() | ajoute / retire au début (plus lent : tout se décale) | oui |
splice(i, n) | retire n éléments à partir de l'indice i et les renvoie ; peut aussi en insérer | oui |
slice(debut, fin) | renvoie une copie d'une partie (fin exclue) | non |
concat(autre) [...a, ...b] | assemble des tableaux dans un nouveau | non |
reverse() sort() fill(x) | inversent, trient, remplissent | oui |
const t = [1, 2, 3, 4, 5];
const retires = t.splice(1, 2); // retire 2 éléments à partir de l'indice 1
console.log(t.join(" "), "|", retires.join(" "));
console.log(t.slice(0, 2).join(" "));
Parcourir
for (const x of t) pour les valeurs, un for classique quand il faut l'indice, t.forEach((x, i) => …) pour appeler une fonction par élément (voir Boucles).
Transformer : map, filter, reduce
Ces trois méthodes ne modifient pas le tableau d'origine : elles en renvoient un nouveau (ou une valeur). map produit un tableau de même taille, filter un tableau plus court, reduce combine les éléments grâce à un accumulateur dont on donne la valeur de départ (le second argument). On les enchaîne : notes.filter(…).map(…).
Pour chercher : find renvoie le premier élément qui passe le test (ou undefined), findIndex son indice (ou -1), some répond « au moins un ? » et every « tous ? ».
const ages = [14, 17, 19, 25];
console.log(ages.find((a) => a >= 18));
console.log(ages.some((a) => a < 16), ages.every((a) => a >= 14));
console.log(ages.findIndex((a) => a > 100));
Trier : attention au tri par défaut
sort() sans argument trie comme du texte : 10 vient avant 9 parce que "1" précède "9". Pour des nombres, donne une fonction de comparaison (a, b) => a - b (négative : a avant b). Pour du texte avec accents, a.localeCompare(b). Et sort modifie le tableau : trie une copie ([...t].sort(…)) si tu veux garder l'original.
const nombres = [10, 9, 1, 100];
console.log([...nombres].sort().join(" "));
console.log([...nombres].sort((a, b) => a - b).join(" "));
const mots = ["éléphant", "zèbre", "abeille"];
console.log(mots.sort((a, b) => a.localeCompare(b)).join(" "));
Affichage1 10 100 9
1 9 10 100
abeille éléphant zèbre
Copier : référence ou vraie copie ?
const b = a; ne copie pas : a et b désignent le même tableau (alias). Pour une copie : [...a], a.slice() ou Array.from(a). Ces copies sont superficielles : si le tableau contient des tableaux ou des objets, ceux-ci restent partagés. structuredClone(a) fait une copie complète. C'est l'*aliasing* de Aliasing et copies.
const a = [1, 2, 3];
const alias = a;
const copie = [...a];
alias.push(4);
console.log(a.length, copie.length);
Décomposition et spread
La décomposition ([x, y] = tableau) extrait des éléments dans des variables, ...reste ramasse les suivants, et permet d'échanger deux variables sans variable temporaire. L'opérateur spread ...t « déplie » un tableau, par exemple pour passer ses éléments comme arguments.
const [premier, deuxieme, ...reste] = [10, 20, 30, 40];
let a = 1;
let b = 2;
[a, b] = [b, a];
console.log(premier, deuxieme, reste.join(","), a, b);
console.log(Math.max(...[3, 9, 2]));
Affichage10 20 30,40 2 1
9
Tableaux à deux dimensions
Un tableau 2D est un tableau de tableaux : grille[ligne][colonne]. Pour le créer, ne remplis jamais avec Array(n).fill(Array(m).fill(0)) : le même tableau-ligne est alors partagé par toutes les lignes. Utilise Array.from avec une fonction qui construit une ligne neuve à chaque fois (voir Construction sans piège).
const bon = Array.from({ length: 2 }, () => Array(3).fill(0));
const piege = Array(2).fill(Array(3).fill(0));
bon[0][1] = 5;
piege[0][1] = 5;
console.log(JSON.stringify(bon));
console.log(JSON.stringify(piege));
Affichage[[0,5,0],[0,0,0]]
[[0,5,0],[0,5,0]]