Comprendre le rôle de reduce
Comparer systématiquement reduce vs boucle
Voir comment l’accumulateur peut être un nombre, un objet, un tableau, une structure composite, voire une Map
Illustrer avec un tableau d’étudiants
const etudiants = [
{ nom: 'Alice', note: 15, filiere: 'Info' },
{ nom: 'Bob', note: 9, filiere: 'Info' },
{ nom: 'Chloé', note: 18, filiere: 'Maths' },
{ nom: 'David', note: 12, filiere: 'Maths' },
];
let somme = 0; for (let i = 0; i < etudiants.length; i++) { somme += etudiants[i].note; } const moyenneFor = somme / etudiants.length; console.log(moyenneFor); // 13.5
let somme = 0; for (let i = 0; i < etudiants.length; i++) { somme += etudiants[i].note; } const moyenneFor = somme / etudiants.length; console.log(moyenneFor); // 13.5
Somme des notes :
- let sommeNotesFor = 0;
- for (let i = 0; i < etudiants.length; i++) {
- sommeNotesFor += etudiants[i].note;
- }
- console.log(sommeNotesFor); // 54
🚀reduce
- const sommeNotes = etudiants.reduce((acc, etu) => acc + etu.note, 0);
- console.log(sommeNotes); // 54
Idée :
acc est l’accumulateur (ici un nombre).
On part de 0 et on ajoute la note de chaque étudiant.
La moyenne
- let somme = 0;
- for (let i = 0; i < etudiants.length; i++) {
- somme += etudiants[i].note;
- }
- const moyenneFor = somme / etudiants.length;
- console.log(moyenneFor); // 13.5
🚀reduce
- const moyenne = etudiants.reduce((acc, etu, index, array) => {
- acc += etu.note;
- return index === array.length - 1 ? acc / array.length : acc;
- }, 0);
- console.log(moyenne); // 13.5
Idée :
On utilise index et array pour diviser à la dernière itération.
On obtient directement la moyenne en une seule passe, sans variable intermédiaire.
Regrouper par filière
- let parFiliereFor = {};
- for (let i = 0; i < etudiants.length; i++) {
- const etu = etudiants[i];
- if (!parFiliereFor[etu.filiere]) {
- parFiliereFor[etu.filiere] = [];
- }
- parFiliereFor[etu.filiere].push(etu);
- }
- console.log(parFiliereFor);
🚀reduce
- const parFiliere = etudiants.reduce((acc, etu) => {
- if (!acc[etu.filiere]) acc[etu.filiere] = [];
- acc[etu.filiere].push(etu);
- return acc;
- }, {});
- console.log(parFiliere);
Idée :
reduce transforme un tableau en un objet structuré.
Trouver le meilleur étudiant
- let meilleurFor = etudiants[0];
- for (let i = 1; i < etudiants.length; i++) {
- if (etudiants[i].note > meilleurFor.note) {
- meilleurFor = etudiants[i];
- }
- }
- console.log(meilleurFor);
🚀reduce
- const meilleur = etudiants.reduce((acc, etu) => {
- return etu.note > acc.note ? etu : acc;
- }, etudiants[0]);
- console.log(meilleur);
Idée :
L’accumulateur est un étudiant (un objet), pas un nombre.
À chaque étape, on garde celui qui a la meilleure note.
c'est quoi ?
const c = etudiants.reduce((acc, etu) => {
acc[etu.filiere] = (acc[etu.filiere] || 0) + 1;
return acc;
}, {});
console.log(c);
// { Info: 2, Maths: 2 }
👑Exemple complet :
- const stats = etudiants.reduce((acc, etu) => {
- // 1. Regroupement
- if (!acc.groupes[etu.filiere]) acc.groupes[etu.filiere] = [];
- acc.groupes[etu.filiere].push(etu);
- // 2. Calcul des moyennes (Map)
- const total = (acc.moyennes.get(etu.filiere) || 0) + etu.note;
- acc.moyennes.set(etu.filiere, total);
- return acc;
- }, { groupes: {}, moyennes: new Map() }); // 🥷🏼
- // Finalisation : calcul des moyennes
- for (const filiere of stats.moyennes.keys()) {
- const total = stats.moyennes.get(filiere);
- const count = stats.groupes[filiere].length;
- stats.moyennes.set(filiere, total / count);
- }
let somme = 0; for (let i = 0; i < etudiants.length; i++) { somme += etudiants[i].note; } const moyenneFor = somme / etudiants.length; console.log(moyenneFor); // 13.5
let somme = 0; for (let i = 0; i < etudiants.length; i++) { somme += etudiants[i].note; } const moyenneFor = somme / etudiants.length; console.log(moyenneFor); // 13.5let somme = 0; for (let i = 0; i < etudiants.length; i++) { somme += etudiants[i].note; } const moyenneFor = somme / etudiants.length; console.log(moyenneFor); // 13.5
const moyenne = etudiants.reduce((acc, etu, index, array) => { acc += etu.note; return index === array.length - 1 ? acc / array.length : acc; }, 0); console.log(moyenne); // 13.5
const moyenne = etudiants.reduce((acc, etu, index, array) => { acc += etu.note; return index === array.length - 1 ? acc / array.length : acc; }, 0); console.log(moyenne); // 13.5
{ nom: 'Alice', note: 15, filiere: 'Info' }, { nom: 'Bob', note: 9, filiere: 'Info' }, { nom: 'Chloé', note: 18, filiere: 'Maths' }, { nom: 'David', note: 12, filiere: 'Maths' }, ];