Ah JavaScript, tu ne cesses de me surprendre par tes pièges. La fonction sort
en a plus d’un. Commençons avec sa description.
La méthode sort()
trie les éléments d’un tableau, dans ce même tableau, et renvoie le tableau. Par défaut, le tri s’effectue sur les éléments du tableau convertis en chaînes de caractères et triées selon les valeurs des unités de code UTF-16 des caractères. [Réf]
Emphase sur «convertis en chaînes de caractères». Il s’avère donc que le code suivant
data = [1, 2, 3, 20, 10]
data.sort();
console.log(data)
retourne
[ 1, 10, 2, 20, 3 ]
Il faut donc fournir sa propre fonction de tri. Mais, il y a encore un piège. Allons-y avec l’implémentation naïve.
data = [1,2,3,20,10]
data.sort((left, right) => left < right);
console.log(data)
retourne
[ 1, 2, 3, 20, 10 ]
Regardez où se situe le 20. Pas là où on s’attendrait. Le problème est que la fonction passée en argument à sort
ne doit pas retourner un booléen, elle doit retourner un entier < 0
, = 0
ou > 0
. Donc, la bonne solution pour trier des entiers en ordre croissant est
data = [1, 2, 3, 20, 10]
data.sort((left, right) => left - right);
console.log(data)
ce qui retourne
[ 1, 2, 3, 10, 20 ]
Merci JavaScript. Merci.
Mise à jour 2022-02-20
Nicolas Kruchten m’a fait remarquer que Python, jusqu’à la version 2.4, avait le même design questionnable de la fonction passée à sort. Ils en gardent d’ailleurs la trace dans la documentation de la version courrante.