Comprendre le chaining de map, filter et reduce

Le par 

Apprenez à combiner map, filter et reduce pour écrire du code JavaScript plus clair et puissant.

Pourquoi chaîner map, filter et reduce ?

Lorsqu’on travaille avec des tableaux en JavaScript, il est très courant d’avoir besoin d’enchaîner plusieurs transformations :

Plutôt que de faire plusieurs étapes séparées, JavaScript nous permet de chaîner ces méthodes. Cela rend votre code :

Avant de poursuivre, assurez-vous d’avoir bien compris les méthodes map, filter et reduce.

Le concept du chaining

Chaque appel .map(), .filter(), ou .reduce() retourne un résultat que l’on peut enchaîner avec un autre appel.

array
.map(...)
.filter(...)
.reduce(...);

L’ordre dans lequel vous les utilisez dépend de ce que vous voulez obtenir ! Passons donc à des exemples concrets pour que vous voyiez le chaining en action.

Exemples concrets

Exemple 1 : Doubler les nombres positifs et faire leur somme

On a un tableau de nombres, et on veut :

const nombres = [-2, 3, 0, 7, -5];

const resultat = nombres
.filter((n) => n > 0) // Garde [3, 7]
.map((n) => n \* 2) // Transforme en [6, 14]
.reduce((acc, n) => acc + n, 0); // Fait la somme : 6 + 14 = 20

console.log(resultat); // 20

Explication :

Exemple 2 : Extraire les prénoms en majuscule des utilisateurs actifs

On a un tableau d’utilisateurs avec leur état d’activité.

Objectif :

const utilisateurs = [
  { prenom: "alice", actif: true },
  { prenom: "bob", actif: false },
  { prenom: "charlie", actif: true },
];

const prenomsActifs = utilisateurs
  .filter((u) => u.actif) // Garde Alice et Charlie
  .map((u) => u.prenom) // Prend leur prénom ["alice", "charlie"]
  .map((prenom) => prenom.toUpperCase()); // Met en majuscule ["ALICE", "CHARLIE"]

console.log(prenomsActifs); // ["ALICE", "CHARLIE"]

Explication :

Exemple 3 : Calculer la taille moyenne des noms de fichiers .js

Vous avez un tableau de fichiers. Vous voulez :

const fichiers = ["index.html", "app.js", "main.js", "style.css"];

const moyenneLongueur = fichiers
  .filter((fichier) => fichier.endsWith(".js")) // ["app.js", "main.js"]
  .map((fichier) => fichier.length) // [6, 7]
  .reduce((acc, longueur, _, arr) => acc + longueur / arr.length, 0);

console.log(moyenneLongueur); // 6.5

Explication :

L’astuce ici : dans .reduce(), on utilise le 4ᵉ paramètre (arr), qui est le tableau courant, pour connaître sa longueur. Vous voyez le _ en 3ème argument de la méthode ? Ça mérite une petite explication !

Pour rappel (n’hésitez pas à lire mon article sur reduce), voici la signature de cette méthode :

array.reduce((accumulateur, valeurCourante, index, tableau) => ..., valeurInitiale);

Les paramètres du callback .reduce() sont :

Vous l’aurez compris, _ correspond à l’index, que je n’utilise pas ici. _ est une convention qui veut dire : “je reçois cette valeur, mais je ne m’en sers pas.”. Ça rend le code plus clair : quelqu’un qui lit votre code (peut-être vous-même dans quelques temps) sait tout de suite que l’index ne compte pas ici.

Exercices

Exercice 1 : Doubler les nombres pairs

À partir d’un tableau de nombres, gardez seulement les pairs, puis doublez-les.

const nombres = [1, 2, 3, 4, 5];
// Résultat attendu : [4, 8]
Solution
const resultat = nombres
  .filter((n) => n % 2 === 0) // Garde 2 et 4
  .map((n) => n * 2); // Double 2 et 4 => [4, 8]

.filter() garde les nombres pairs (n % 2 === 0) et .map() multiplie chacun par 2.

Exercice 2 : Comptabiliser le nombre de prénoms commençant par “A”.

Attention, le but ici est d’utiliser le chaining !

const prenoms = ["Alex", "Oscar", "Kimi", "Yuki"];
// Résultat attendu : 1
Solution
const nombreA = prenoms
  .filter((prenom) => prenom.startsWith("A")) // ["Alex"]
  .reduce((acc) => acc + 1, 0); // Compte : 1

.filter() conserve les prénoms qui commencent par “A” et .reduce() compte combien il y en a.

Exercice 3 : Somme des âges des utilisateurs majeurs

const utilisateurs = [
  { nom: "Valteri", age: 17 },
  { nom: "Lewis", age: 22 },
  { nom: "Charles", age: 18 },
];
// Résultat attendu : 40
Solution
const sommeAges = utilisateurs
  .filter((utilisateur) => utilisateur.age >= 18) // Garde Lewis (22) et Charles (18)
  .map((utilisateur) => utilisateur.age) // Extrait les âges [22, 18]
  .reduce((acc, age) => acc + age, 0); // Fait la somme 22 + 18 = 40
  • .filter() conserve les utilisateurs majeurs (18 ans ou plus)
  • .map() extrait leur âge
  • .reduce() additionne les âges

Bonnes pratiques

En résumé

Chainer .map(), .filter() et .reduce() vous permet de transformer, filtrer et agréger vos données de manière élégante. En maîtrisant cette approche, vous gagnerez en productivité et en lisibilité.

Et petit conseil : commencez toujours par écrire chaque étape séparément si besoin, puis enchaînez-les progressivement.

Copyright © 2025 - CodeCodeCoders. Tous droits réservés.

Hébergé par Netlify - 512 2nd Street, Suite 200 San Francisco, CA 94107