Reduce : sort inside

Analyser le code suivant.


  1. const posts = [

  2.   {id: "moi", upVotes: 20},

  3.   {id: "toi", upVotes: 89},

  4.   {id: "lui", upVotes: 1},

  5.   {id: "eux", upVotes: 123},];


  6. let [a,b] = posts.reduce((acc, cur) =>
  7.             [cur, ...acc]
  8.                 .sort((a,b) => b.upVotes - a.upVotes)
  9.                 .slice(0,2)
  10.              ,[]);



Que valent a et b. On pourra compléter le schéma suivant :


En savoir plus sur : concat

On commencera par comprendre la fonction suivante :

  1. let u = posts.reduce(function(acc, cur){
  2.             
  3.    acc = [...acc, cur];
  4.             
  5.    return acc;
  6.             
  7. },[]);

  1. let u = posts.reduce(function(acc, cur){
  2.             
  3.    acc = [...acc, cur].sort((a,b) => b.upVotes - a.upVotes) 
  4.             
  5.    return acc;
  6.             
  7. },[]);

On peut également écrire :

  1. acc = [...acc, cur].sort(( {upVotes:a} ,{upVotes:b}) => b - a)


  code

Dessiner le code suivant :


  1. let u = posts.reduce(function(acc, cur){
  2.    
  3.    acc = [cur, acc].sort(( {upVotes:a} ,{upVotes:b}) => b - a) 
  4.    
  5.    return acc;
  6.             
  7. },[]);

code

Performances
Sans approfondir la question importante des performances, considérons le cas de grands tableaux.

const posts = [];
const random = (min, max) => Math.floor(Math.random() * (max - min)) + min
for (let i = 0; i < 50000; i++) {
posts.push({ id:`ID_${i}`, upVotes: random(1, 1000000) });
}


console.time("sort after");
let [c,d] = posts
              .reduce((acc, cur) => [cur, ...acc],[])
              .sort((a,b) => b.upVotes - a.upVotes)
              .slice(0,2);
console.timeEnd("sort after");



console.time("sort inside");
let [a,b] = posts
                .reduce((acc, cur) =>
                           [cur, ...acc]
                               .sort((a,b) => b.upVotes - a.upVotes)
                               .slice(0,2)
             ,[]);

console.timeEnd("sort inside");


Les simulations en temps sont sans appel !
$ node bidon.js
sort after: 16193.376ms
sort inside: 49.695ms

$ node bidon.js
sort after: 16177.614ms
sort inside: 32.176ms

code