Trier un tableau à l'aide d'une fonction

Il est possible de fournir à la méthode sort() la fonction à utiliser pour trier le tableau. Même que cela est l'unique façon de trier autre chose que des chaînes de caractères.

Étant donné que la méthode sort() effectue la conversion automatique des éléments du tableau en chaînes de caractères avant d'effectuer sur eux un tri lexicographique, elle semble incapable de trier des valeurs numériques :

let nombres = [10, -5, 15, -1, 5];

nombres.sort();

document.write(nombres);

Le résultat n'est pas celui recherché :

-1,-5,10,15,5

La solution consiste à fournir à sort() une fonction pour trier le tableau selon d'autres critères.

Écrivons par exemple une fonction qui compare deux valeurs numériques et utilison-la pour trier notre tableau de nombres entiers :

function comparerNombres(n1, n2) {
  if (n1 > n2)
    return 1;
  else if (n1 == n2)
    return 0;
  else // n1 < n2
    return -1;
}

let nombres = [10, -5, 15, -1, 5];

nombres.sort(comparerNombres);

document.write(nombres);

Le résultat est dans ce cas celui attendu :

-5,-1,5,10,15

La fonction de comparaison ne doit pas obligatoirement retourner 1, 0 ou -1. En fait, elle doit retourner :

  • une valeur positive si le premier opérande est supérieure au second
  • zéro si les deux opérandes sont égaux
  • une valeur négative si le premier opérande est inférieur au second

Ainsi, pour comparer des valeurs numériques, il devient possible d'écrire une fonction beaucoup plus courte :

function comparerNombres(n1, n2) {
  return n1 - n2;
}
...
nombres.sort(comparerNombres);
...

Ou encore :

...
nombres.sort( function(n1, n2) { return n1 - n2; } );
...

Remarque : La méthode reverse() n'accepte pas de fonction de comparaison. Pour trier en ordre inverse autre chose que des chaînes, il sera nécessaire de modifier notre fonction de comparaison.