bookmark_borderPièges de la fonction pour JavaScript Array Sort

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.