Avancé ! map, reduce

 const languageSkills = [

  {
    language: "Spanish",
    skill: "Professional Proficiency",
  },
  {
    language: "English",
    skill: "Professional Working Proficiency",
  },
  {
    language: "German",
    skill: "Professional Proficiency",
  },
];
const output = languageSkills.reduce((map, { language, skill }) => {
  if (map.has(skill)) map.get(skill).push(language);
  else map.set(skill, [language]);
  return map;
}, new Map());

console.log(...output);

Algo : comparaisons

 let tab = [1, 2, 3, -1, 6, 6, 1, 2, 2, 1];

let i = 0;
while (i < tab.length) {
  let j = i + 1;
  while (j < tab.length) {
    if (tab[i] === tab[j]) {
      // Swap elements
      [tab[i + 1], tab[j]] = [tab[j], tab[i + 1]];
      i++;
    }
    j++;
  }
  i++;
}

[ 1, 1, 1, -1, 6, 6, 2, 2, 2, 3 ]

let groups = tab.reduce((acc, num) => {
  acc[num] = acc[num] || [];
  acc[num].push(num);
  return acc;
}, {});

let result = [].concat(...Object.values(groups));

console.log(result);

┌─────────┬────────┐ │ (index) │ Values │ ├─────────┼────────┤ │ 0 │ 1 │ │ 1 │ 1 │ │ 2 │ 1 │ │ 3 │ 2 │ │ 4 │ 2 │ │ 5 │ 2 │ │ 6 │ 3 │ │ 7 │ 6 │ │ 8 │ 6 │ │ 9 │ -1 │ └─────────┴────────┘

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 :


like aggregation

Voici à quoi ressemble l'aggregation dans une base de données !


const products = [

  {
    "_id": 1,
    "item": "abc",
    "price": 10,
    "quantity": 2,
    "date": "2014-03-01T08:00:00.000Z"
  },
  {
    "_id": 2,
    "item": "jkl",
    "price": 20,
    "quantity": 1,
    "date": "2014-03-01T09:00:00.000Z"
  },
  {
    "_id": 3,
    "item": "xyz",
    "price": 5,
    "quantity": 10,
    "date": "2014-03-15T09:00:00.000Z"
  },
  {
    "_id": 4,
    "item": "xyz",
    "price": 5,
    "quantity": 20,
    "date": "2014-04-04T11:21:39.736Z"
  },
  {
    "_id": 5,
    "item": "abc",
    "price": 10,
    "quantity": 10,
    "date": "2014-04-04T21:23:13.331Z"
  },
  {
    "_id": 6,
    "item": "def",
    "price": 7.5,
    "quantity": 5,
    "date": "2015-06-04T05:08:13.000Z"
  },
  {
    "_id": 7,
    "item": "def",
    "price": 7.5,
    "quantity": 10,
    "date": "2015-09-10T08:43:00.000Z"
  },
  {
    "_id": 8,
    "item": "abc",
    "price": 10,
    "quantity": 5,
    "date": "2016-02-06T20:20:13.000Z"
  }
]

 const groupBy = (arr, key) =>

arr.reduce((acc, i) => {
  (acc[i[key]] = acc[i[key]] || [] ).push(i);
  return acc;
}, {});


let result = [];
let items = groupBy(products,"item");
for (const [key, value] of Object.entries(items)) {
  // console.log(`${key}, ${value}`);
  result.push(
    {
      "_id": key,
      "totalSaleAmount": value.reduce(function(acc, cur)  {
        acc+=cur.price*cur.quantity;
        return acc
      },0)
    }
  )
}
//console.table(result)
console.log(result)