Trier en JavaScript

Introduction au .sort()

En JavaScript, la méthode .sort() des tableaux est utilisée pour réorganiser les éléments d'un tableau et renvoie le tableau trié. Ce procédé est effectué sur place, ce qui signifie que le tableau d'origine est modifié sans qu'une copie ne soit réalisée. Par défaut, le tri est effectué en ordre croissant en considérant les valeurs comme des chaînes.

Syntaxe

Voici comment utiliser la méthode .sort() :

// Effectuer un tri par défaut
certainTableau.sort();

// Utiliser une fonction fléchée pour les comparaisons
certainTableau.sort((A, B) => { ... });

// Utiliser une fonction de comparaison inline
certainTableau.sort(function compareFn(A, B) { ... });

// Utiliser une fonction de comparaison définie précédemment
certainTableau.sort(compareFn);

Dans ces exemples, compareFn est la fonction de comparaison optionnelle, A représente le premier élément du tableau comparé, et B est le deuxième élément comparé.

Ordre de tri par défaut

Lorsqu'aucune fonction de comparaison n’est spécifiée, .sort() classe les éléments du tableau en ordre croissant sous forme de chaînes. Pour les éléments non-string, .sort() les convertit en chaînes avant la comparaison, ce qui peut entraîner des résultats inattendus. Par exemple :

let nombres = [33, 16, 156, 2, 9, 5, 10];
nombres.sort();
console.log(nombres); // Sortie : [10, 156, 16, 2, 33, 5, 9]

Fonction de comparaison

La fonction de comparaison, si fournie, définit l’ordre de tri des éléments non-undefined dans le tableau. Tous les éléments undefined sont regroupés à la fin. La fonction de comparaison fonctionne de la manière suivante :

Pour CompareFn(A, B) : - Si la fonction retourne un nombre supérieur à zéro, B sera trié avant A. - Si elle retourne un nombre inférieur à zéro, A sera trié avant B. - Si le résultat est zéro, les positions de A et B restent inchangées.

La fonction doit toujours renvoyer le même résultat pour une paire d’éléments donnée A et B, sinon l'ordre de tri est indéfini.

Tri numérique

Pour trier un tableau en ordre numérique plutôt qu'en ordre de chaîne, vous pouvez utiliser la fonction suivante, en supposant que le tableau ne contienne ni Infinity ni NaN :

function compareFn(A, B) {  return A - B;}

Ainsi, nous pouvons corriger l’exemple précédent comme suit :

let nombres = [33, 16, 156, 2, 9, 5, 10];
nombres.sort(function compareFn(A, B) { return A - B; });
console.log(nombres); // Sortie : [2, 5, 9, 10, 16, 33, 156]

Exemple pratique

Prenons un exemple pratique où nous utilisons une fonction de comparaison avec .sort() pour trier un tableau de mots par ordre alphabétique, en ignorant la casse :

let villes = ['Paris', 'paris', 'Londres', 'londres', 'Tokyo'];
villes.sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()));
console.log(villes); // Sortie : ['Londres', 'londres', 'Paris', 'paris', 'Tokyo']