Pages

Reduce

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 : 

  1. let sommeNotesFor = 0;

  2. for (let i = 0; i < etudiants.length; i++) {
  3.   sommeNotesFor += etudiants[i].note;
  4. }

  5. console.log(sommeNotesFor); // 54
🚀reduce
  1. const sommeNotes = etudiants.reduce((acc, etu) => acc + etu.note, 0);
  2. 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

  1. let somme = 0;

  2. for (let i = 0; i < etudiants.length; i++) {
  3.   somme += etudiants[i].note;
  4. }

  5. const moyenneFor = somme / etudiants.length;
  6. console.log(moyenneFor); // 13.5
🚀reduce
  1. const moyenne = etudiants.reduce((acc, etu, index, array) => {
  2.   acc += etu.note;
  3.   return index === array.length - 1 ? acc / array.length : acc;
  4. }, 0);

  5. 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

  1. let parFiliereFor = {};

  2. for (let i = 0; i < etudiants.length; i++) {
  3.   const etu = etudiants[i];
  4.   if (!parFiliereFor[etu.filiere]) {
  5.     parFiliereFor[etu.filiere] = [];
  6.   }
  7.   parFiliereFor[etu.filiere].push(etu);
  8. }

  9. console.log(parFiliereFor);
🚀reduce
  1. const parFiliere = etudiants.reduce((acc, etu) => {
  2.   if (!acc[etu.filiere]) acc[etu.filiere] = [];
  3.   acc[etu.filiere].push(etu);
  4.   return acc;
  5. }, {});

  6. console.log(parFiliere);
Idée :

reduce transforme un tableau en un objet structuré.

 Trouver le meilleur étudiant

  1. let meilleurFor = etudiants[0];

  2. for (let i = 1; i < etudiants.length; i++) {
  3.   if (etudiants[i].note > meilleurFor.note) {
  4.     meilleurFor = etudiants[i];
  5.   }
  6. }

  7. console.log(meilleurFor);
🚀reduce
  1. const meilleur = etudiants.reduce((acc, etu) => {
  2.   return etu.note > acc.note ? etu : acc;
  3. }, etudiants[0]);

  4. 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 : 

  1. const stats = etudiants.reduce((acc, etu) => {
  2.   // 1. Regroupement
  3.   if (!acc.groupes[etu.filiere]) acc.groupes[etu.filiere] = [];
  4.   acc.groupes[etu.filiere].push(etu);

  5.   // 2. Calcul des moyennes (Map)
  6.   const total = (acc.moyennes.get(etu.filiere) || 0) + etu.note;
  7.   acc.moyennes.set(etu.filiere, total);

  8.   return acc;
  9. }, { groupes: {}, moyennes: new Map() }); // 🥷🏼

  10. // Finalisation : calcul des moyennes
  11. for (const filiere of stats.moyennes.keys()) {
  12.   const total = stats.moyennes.get(filiere);
  13.   const count = stats.groupes[filiere].length;
  14.   stats.moyennes.set(filiere, total / count);
  15. }





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' }, ];