map

  1. const courses = [

  2.     { name: "HTML", levels: ["L1", "L2"] },

  3.     { name: "CSS", levels: ["L1", "L2"] },

  4.     { name: "JS", levels: ["L2", "L3", "M1"] }

  5. ]


  6. const levels = new Set(courses.reduce((acc, { levels: levels }) => ([...acc, ...levels]), []));


  7. const programme = courses.reduce((a, { levels: levels, name }) => {

  8.     for (let level of levels) {

  9.         if (!a[level]) a[level] = [];

  10.         a[level].push(name);

  11.     }

  12.     return a;

  13. }, {});



  14. const menu = Object.entries(programme).map(([level, courses]) => {

  15.     return {

  16.         title: level,

  17.         subnav: courses.map((course) => {

  18.             return { title: course }

  19.         })

  20.     }

  21. })


  22. console.dir(JSON.stringify(menu));


Affiche.
[
{"title":"L1","subnav":[{"title":"HTML"},{"title":"CSS"}]}
,{"title":"L2","subnav":[{"title":"HTML"},{"title":"CSS"},{"title":"JS"}]}
,{"title":"L3","subnav":[{"title":"JS"}]}
,{"title":"M1","subnav":[{"title":"JS"}]}
]

this = un paramétre !

This doit être vu comme un paramétre.

This permet d'économiser du code en mémoire.

Exemple de code

  1. let user = { name: "John", f: say };
  2. let admin = { name: "Admin", f: say };

  3. function say(what="Hi") {
  4.   console.log(`${what} ${this.name}`);
  5. }

  6. // these calls have different this
  7. // "this" inside the function is the object "before the dot"
  8. user.f("Hello"); // John  (this == user)
  9. admin.f("Please"); // Admin  (this == admin)

  10. admin['f']();
Pour connaitre la valeur du paramétre this. Il faut regarder l'objet qui appelle la fonction !



Erreur classique.

Il est important de comprendre que this n'est pas lié à user lors de la définition




Comme un paramétre classique, c'est lors de l'appel de la méthode que l'on connait la valeur de this.


Autre exemple :