Visit Mozilla.org

Référence de JavaScript 1.5 Core:Objets globaux:Array:sort

Un article de MDC.


Sommaire

[modifier] Résumé

Trie en place les éléments d'un tableau.

Méthode de Array
Implémentation : JavaScript 1.1, NES 2.0

JavaScript 1.2 : comportement modifié.

Version ECMA : ECMA-262

[modifier] Syntaxe

array.sort(fonctionComparaison);

[modifier] Paramètres

fonctionComparaison 
Spécifie une fonction définissant l'ordre de tri. Si absente, le tableau est trié selon l'ordre lexicographique (dans l'ordre du dictionnaire) d'après la conversion en chaîne de caractères de chaque élément.

[modifier] Description

Si le paramètre fonctionComparaison n'est pas fourni, les éléments sont triés en le convertissant en chaînes de caractères et en comparant ces chaines dans l'ordre lexicographique (dans l'ordre du dictionnaire ou d'un annuaire, pas en ordre numérique). Par exemple, "80" arrive avant "9" en ordre lexicographique, mais dans un tri numérique, 9 arriverait avant 80.

Si le paramètre fonctionComparaison est fourni, les éléments du tableau sont triés selon la valeur de retour de la fonction de comparaison. Si a et b sont deux éléments à comparer, alors :

  • Si fonctionComparaison(a, b) est inférieur à 0, trie a avec un indice inférieur à b.
  • Si fonctionComparaison(a, b) renvoie 0, laisse a et b inchangés l'un par rapport à l'autre, mais triés par rapport à tous les autres éléments. Note : la norme ECMAscript ne garantit pas ce comportement, par conséquent tous les navigateurs (par exemple les versions de Mozilla antérieures à 2003) ne respectent pas ceci.
  • Si fonctionComparaison(a, b) est supérieur à 0, trie b avec un indice inférieur à a.

Donc, la fonction de comparaison a la forme suivante :

function compare(a, b)
{
  if (a est inférieur à b selon les critères de tri)
     return -1;
  if (a est supérieur à b selon les critères de tri)
     return 1;
  // a doit être égal à b
  return 0;
}

Pour comparer des nombres plutôt que des chaînes, la fonction de comparaison peut simplement soustraire b à a :

function compareNombres(a, b)
{
  return a - b;
}

Certaines implémentations de JavaScript utilisent un tri stable : l'ordre partiel de a et b ne change pas si a et b sont égaux. Si l'indice de a était inférieur à celui de b avant le tri, il le sera toujours après, quels que soient les mouvements de a et b dus au tri.

Le tri est stable dans SpiderMonkey et tous les navigateurs basés sur Mozilla à partir de Gecko 1.9 (voir le bug 224128).

Le comportement de la méthode sort a changé entre JavaScript 1.1 et JavaScript 1.2.

En JavaScript 1.1, sur certaines plateformes, la méthode sort ne fonctionnait pas. Le tri fonctionne sur toutes les plateformes à partir de JavaScript 1.2.

En JavaScript 1.2, cette méthode ne convertit plus les éléments non définis (undefined) en null ; elle les place en fin de tableau. Par exemple, supposons que vous ayez ce script :

var a = [];
a[0] = "araignée";
a[5] = "zèbre";

// suppose qu'une fonction print est définie
function writeArray(x)
{
  for (i = 0; i < x.length; i++)
  {
    print(x[i]);
    if (i < x.length-1)
      print(", ");
  }
}

writeArray(a);
a.sort();
print("\n");
writeArray(a);

En JavaScript 1.1, cette fonction affichait :

araignée, null, null, null, null, zèbre
araignée, null, null, null, null, zèbre

En JavaScript 1.2, elle affichera :

araignée, undefined, undefined, undefined, undefined, zèbre
araignée, zèbre, undefined, undefined, undefined, undefined

[modifier] Exemples

[modifier] Exemple : création, affichage et tri d'un tableau

L'exemple qui suit crée quatre tableaux et affiche le tableau original, puis les tableaux triés. Les tableaux numériques sont triés d'abord sans, puis avec une fonction de comparaison.

var stringArray = ["Bleue", "Bosse", "Béluga"];
var numericStringArray = ["80", "9", "700"];
var numberArray = [40, 1, 5, 200];
var mixedNumericArray = ["80", "9", "700", 40, 1, 5, 200];

function compareNombres(a, b)
{
  return a - b;
}

// suppose qu'une fonction print function a été définie
print("Chaînes : " + stringArray.join() +"\n");
print("Triées : " + stringArray.sort() +"\n\n");

print("Nombres : " + numberArray.join() +"\n");
print("Triés sans fonction de comparaison : " + numberArray.sort() +"\n");
print("Triés avec compareNombres : " + numberArray.sort(compareNombres) +"\n\n");

print("Chaînes numériques : " + numericStringArray.join() +"\n");
print("Triées sans fonction de comparaison : " + numericStringArray.sort() +"\n");
print("Triées avec compareNombres : " + numericStringArray.sort(compareNombres) +"\n\n");
print("Nombres et chaînes numériques : " + mixedNumericArray.join() +"\n");
print("Triés sans fonction de comparaison : " + mixedNumericArray.sort() +"\n");
print("Triés avec compareNombres : " + mixedNumericArray.sort(compareNombres) +"\n\n");

Cet exemple produit la sortie suivante. Comme on peut le voir, lorsqu'on utilise la fonction de comparaison, les nombres sont triés correctement qu'ils soient des nombres ou des chaînes numériques.

Chaînes : Bleue,Bosse,Béluga
Triées : Béluga,Bleue,Bosse

Nombres : 40,1,5,200
Triés sans fonction de comparaison : 1,200,40,5
Triés avec compareNombres : 1,5,40,200

Chaînes numériques : 80,9,700
Triées sans fonction de comparaison : 700,80,9
Triées avec compareNombres : 9,80,700

Nombres et chaînes numériques : 80,9,700,40,1,5,200
Triés sans fonction de comparaison : 1,200,40,5,700,80,9
Triés avec compareNombres : 1,5,9,40,80,200,700

[modifier] Voir aussi

join, reverse.