J'ai eu un problème similaire en affichant les blocs du pool de mémoire à partir de la sortie de la composition de certaines fonctions virtuelles du DOM. En fait, j'ai été confronté au même problème en triant des données multicritères telles que les résultats des joueurs du monde entier.
J'ai remarqué que le tri multicritères est :
- sort by the first column
- if equal, sort by the second
- if equal, sort by the third
- etc... nesting and nesting if-else
Et si vous ne vous en souciez pas, vous risquez d'échouer rapidement dans un enfer d'imbrication if-else... comme l'enfer du callback des promesses...
Et si nous écrivions une fonction "prédicat" pour décider de la partie de l'alternative à utiliser ? Le prédicat est simplement :
// useful for chaining test
const decide = (test, other) => test === 0 ? other : test
Maintenant, après avoir écrit vos tests de classification (byCountrySize, byAge, byGameType, byScore, byLevel...) selon vos besoins, vous pouvez pondérer vos tests (1 = asc, -1 = desc, 0 = disable), les mettre dans un tableau, et appliquer une fonction réductrice 'decide' comme ceci :
const multisort = (s1, s2) => {
const bcs = -1 * byCountrySize(s1, s2) // -1 = desc
const ba = 1 *byAge(s1, s2)
const bgt = 0 * byGameType(s1, s2) // 0 = doesn't matter
const bs = 1 * byScore(s1, s2)
const bl = -1 * byLevel(s1, s2) // -1 = desc
// ... other weights and criterias
// array order matters !
return [bcs, ba, bgt, bs, bl].reduce((acc, val) => decide(val, acc), 0)
}
// invoke [].sort with custom sort...
scores.sort(multisort)
Et voilà ! A vous de définir vos propres critères / poids / ordres... mais vous voyez l'idée. J'espère que cela vous aidera !
E * s'assurer qu'il y a un ordre de tri total sur chaque colonne * s'assurer qu'il n'y a pas de dépendances entre les ordres des colonnes, et qu'il n'y a pas de dépendances circulaires
sinon, le tri peut être instable !