| [ Web Proxy ] |
| Viewing: https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Global_Objects/Array/sort | [Back] [Original] |
Get to know MDN better
Cette page a t traduite partir de l'anglais par la communaut. Vous pouvez contribuer en rejoignant la communaut francophone sur MDN Web Docs.
Cette fonctionnalit est bien tablie et fonctionne sur de nombreux appareils et versions de navigateurs. Elle est disponible sur tous les navigateurs depuis juillet 2015.
La mthode sort() des instances de Array trie les lments d'un tableau en place et retourne la rfrence vers ce mme tableau, dsormais tri. L'ordre de tri par dfaut est croissant, bas sur la conversion des lments en chanes de caractres, puis la comparaison de leurs squences d'units de code UTF-16.
La complexit temporelle et spatiale du tri n'est pas garantie, car elle dpend de l'implmentation.
Pour trier les lments d'un tableau sans modifier le tableau original, utilisez toSorted().
const months = ["March", "Jan", "Feb", "Dec"];
months.sort();
console.log(months);
// Rsultat attendu : Array ["Dec", "Feb", "Jan", "March"]
const array = [1, 30, 4, 21, 100000];
array.sort();
console.log(array);
// Rsultat attendu : Array [1, 100000, 21, 30, 4]
sort()
sort(compareFn)
compareFn FacultatifUne fonction qui dtermine l'ordre des lments. La fonction est appele avec les arguments suivants :
aLe premier lment comparer. Ne sera jamais undefined.
bLe second lment comparer. Ne sera jamais undefined.
Elle doit retourner un nombre o :
a doit prcder b.a doit suivre b.NaN indique que a et b sont considrs comme gaux.Pour s'en souvenir, rappelez-vous que (a, b) => a - b trie les nombres par ordre croissant.
Si ce paramtre est omis, les lments du tableau sont convertis en chanes de caractres, puis tris selon la valeur du point de code Unicode de chaque caractre.
La rfrence vers le tableau d'origine, dsormais tri. Notez que le tableau est tri en place, aucune copie n'est ralise.
Si compareFn n'est pas fourni, tous les lments du tableau qui ne valent pas undefined sont tris en les convertissant en chanes de caractres et en comparant ces chanes selon l'ordre des units de code UTF-16. Par exemple, banane sera tri avant cerise . Dans un tri numrique, 9 sera tri avant 80, mais comme les nombres sont convertis en chanes de caractres, 80 arrive avant 9 selon l'ordre Unicode. Tous les lments valant undefined sont placs la fin du tableau.
La mthode sort() prserve les cases vides. Si le tableau source est un tableau creux, les cases vides sont dplaces la fin du tableau, et arrivent toujours aprs tous les undefined.
Note :
En UTF-16, les caractres Unicode au-dessus de \uFFFF sont encods avec deux units de code surrogates, de l'intervalle \uD800 - \uDFFF. La valeur de chaque unit de code est prise sparment en compte pour la comparaison. Ainsi, le caractre form par la paire surrogate \uD855\uDE51 sera tri avant le caractre \uFF3A.
Si compareFn est fourni, tous les lments du tableau qui ne valent pas undefined sont tris selon la valeur de retour de la fonction de comparaison (tous les lments undefined sont placs la fin du tableau, sans appel compareFn).
Valeur de retour de compareFn(a, b) |
Ordre de tri |
|---|---|
| > 0 | trie a aprs b, par exemple [b, a] |
| < 0 | trie a avant b, par exemple [a, b] |
| === 0 | conserve l'ordre d'origine de a et b |
Ainsi, la fonction de comparaison a la forme suivante :
function compareFn(a, b) {
if (a est infrieur b selon un critre de tri) {
return -1;
} else if (a est suprieur b selon le critre de tri) {
return 1;
}
// a doit tre gal b
return 0;
}
Plus formellement, le comparateur doit respecter les proprits suivantes pour garantir un tri correct :
compareFn(a, a) === 0.compareFn(a, b) et compareFn(b, a) doivent tre tous deux 0 ou avoir des signes opposs.compareFn(a, b) et compareFn(b, c) sont tous deux positifs, nuls ou ngatifs, alors compareFn(a, c) a la mme positivit que les deux prcdents.Un comparateur respectant les contraintes ci-dessus pourra toujours retourner 1, 0 et -1, ou retourner systmatiquement 0. Par exemple, si un comparateur ne retourne que 1 et 0, ou seulement 0 et -1, il ne pourra pas trier correctement car l'antisymtrie est rompue. Un comparateur qui retourne toujours 0 ne modifiera pas le tableau, mais reste fiable.
Le comparateur lexicographique par dfaut respecte toutes les contraintes ci-dessus.
Pour comparer des nombres plutt que des chanes, la fonction de comparaison peut soustraire b a. La fonction suivante triera le tableau par ordre croissant (si le tableau ne contient pas NaN) :
function compareNombres(a, b) {
return a - b;
}
La mthode sort() est gnrique. Elle attend seulement que la valeur de this possde une proprit length et des proprits cls entires. Bien que les chanes de caractres soient aussi assimilables des tableaux, cette mthode ne doit pas tre applique sur elles, car les chanes sont immuables.
L'exemple suivant cre quatre tableaux et affiche le tableau original, puis les tableaux tris. Les tableaux numriques sont tris sans fonction de comparaison, puis tris avec une fonction de comparaison.
const stringArray = ["Blue", "Humpback", "Beluga"];
const numberArray = [40, 1, 5, 200];
const numericStringArray = ["80", "9", "700"];
const mixedNumericArray = ["80", "9", "700", 40, 1, 5, 200];
function compareNumbers(a, b) {
return a - b;
}
stringArray.join(); // 'Blue,Humpback,Beluga'
stringArray.sort(); // ['Beluga', 'Blue', 'Humpback']
numberArray.join(); // '40,1,5,200'
numberArray.sort(); // [1, 200, 40, 5]
numberArray.sort(compareNumbers); // [1, 5, 40, 200]
numericStringArray.join(); // '80,9,700'
numericStringArray.sort(); // ['700', '80', '9']
numericStringArray.sort(compareNumbers); // ['9', '80', '700']
mixedNumericArray.join(); // '80,9,700,40,1,5,200'
mixedNumericArray.sort(); // [1, 200, 40, 5, '700', '80', '9']
mixedNumericArray.sort(compareNumbers); // [1, 5, '9', 40, '80', 200, '700']
On peut trier un tableau d'objets en comparant la valeur de l'une de leurs proprits.
const items = [
{ name: "Edward", value: 21 },
{ name: "Sharpe", value: 37 },
{ name: "And", value: 45 },
{ name: "The", value: -12 },
{ name: "Magnetic", value: 13 },
{ name: "Zeros", value: 37 },
];
// trier par valeur
items.sort((a, b) => a.value - b.value);
// trier par nom
items.sort((a, b) => {
const nameA = a.name.toUpperCase(); // ignorer les majuscules/minuscules
const nameB = b.name.toUpperCase(); // ignorer les majuscules/minuscules
if (nameA < nameB) {
return -1;
}
if (nameA > nameB) {
return 1;
}
// les noms sont gaux
return 0;
});
Pour trier des chanes contenant des caractres non ASCII, c'est--dire des caractres accentus (e, , , a, , etc.) ou des chanes dans d'autres langues que l'anglais, utilisez String.prototype.localeCompare(). Cette fonction permet de comparer ces caractres afin qu'ils apparaissent dans le bon ordre.
const items = ["rserv", "premier", "communiqu", "caf", "adieu", "clair"];
items.sort((a, b) => a.localeCompare(b));
// items vaut ['adieu', 'caf', 'communiqu', 'clair', 'premier', 'rserv']
La fonction compareFn peut tre appele plusieurs fois par lment du tableau. Selon la nature de compareFn, cela peut entraner un surcot important. Plus la fonction de comparaison est complexe et plus le tableau est grand, plus il peut tre efficace d'utiliser map() pour le tri. L'ide est de parcourir le tableau une fois pour extraire les valeurs utilises pour le tri dans un tableau temporaire, de trier ce tableau temporaire, puis de parcourir ce tableau temporaire pour obtenir l'ordre souhait.
// le tableau trier
const data = ["delta", "alpha", "charlie", "bravo"];
// le tableau temporaire contient les objets avec la position et la valeur de tri
const mapped = data.map((v, i) => ({ i, value: someSlowOperation(v) }));
// tri du tableau temporaire contenant les valeurs rduites
mapped.sort((a, b) => {
if (a.value > b.value) {
return 1;
}
if (a.value < b.value) {
return -1;
}
return 0;
});
const result = mapped.map((v) => data[v.i]);
Il existe une bibliothque open source appele mapsort (angl.) qui applique cette approche.
sort() retourne la rfrence du mme tableauLa mthode sort() retourne une rfrence vers le tableau d'origine, donc toute modification du tableau retourn modifie galement le tableau d'origine.
const numbers = [3, 1, 4, 1, 5];
const sorted = numbers.sort((a, b) => a - b);
// numbers et sorted valent tous deux [1, 1, 3, 4, 5]
sorted[0] = 10;
console.log(numbers[0]); // 10
Si vous souhaitez que sort() ne modifie pas le tableau d'origine, mais retourne un tableau copi superficiellement comme d'autres mthodes de tableau (par exemple, map()), utilisez la mthode toSorted(). Vous pouvez aussi faire une copie superficielle avant d'appeler sort(), en utilisant la syntaxe de l'oprateur de propagation ou Array.from().
const numbers = [3, 1, 4, 1, 5];
// [...numbers] cre une copie superficielle, donc sort() ne modifie pas l'original
const sorted = [...numbers].sort((a, b) => a - b);
sorted[0] = 10;
console.log(numbers[0]); // 3
Depuis la version 10 (ou ECMAScript 2019), la spcification impose que Array.prototype.sort soit stable.
Par exemple, supposons que vous ayez une liste d'lves avec leurs notes. Notez que la liste d'lves est dj pr-trie par nom par ordre alphabtique :
const students = [
{ name: "Alex", grade: 15 },
{ name: "Devlin", grade: 15 },
{ name: "Eagle", grade: 13 },
{ name: "Sam", grade: 14 },
];
Aprs avoir tri ce tableau par la proprit grade par ordre croissant :
students.sort((firstItem, secondItem) => firstItem.grade - secondItem.grade);
La variable students aura alors la valeur suivante :
[
{ name: "Eagle", grade: 13 },
{ name: "Sam", grade: 14 },
{ name: "Alex", grade: 15 }, // ordre d'origine conserv pour les mmes notes (tri stable)
{ name: "Devlin", grade: 15 }, // ordre d'origine conserv pour les mmes notes (tri stable)
];
Il est important de noter que les lves ayant la mme note (par exemple, Alex et Devlin) restent dans le mme ordre qu'avant l'appel sort. C'est ce que garantit un algorithme de tri stable.
Avant la version 10 (ou ECMAScript 2019), la stabilit du tri n'tait pas garantie, ce qui pouvait donner :
[
{ name: "Eagle", grade: 13 },
{ name: "Sam", grade: 14 },
{ name: "Devlin", grade: 15 }, // ordre d'origine non conserv
{ name: "Alex", grade: 15 }, // ordre d'origine non conserv
];
Si une fonction de comparaison ne respecte pas toutes les rgles de puret, stabilit, rflexivit, antisymtrie et transitivit, comme expliqu dans la description, le comportement du programme n'est pas dfini.
Par exemple :
const arr = [3, 1, 4, 1, 5, 9];
const compareFn = (a, b) => (a > b ? 1 : 0);
arr.sort(compareFn);
La fonction compareFn ici n'est pas bien forme, car elle ne respecte pas l'antisymtrie : si a > b, elle retourne 1 ; mais en inversant a et b, elle retourne 0 au lieu d'une valeur ngative. Ainsi, le tableau rsultant sera diffrent selon les moteurs JavaScript. Par exemple, V8 (utilis par Chrome, Node.js, etc.) et JavaScriptCore (utilis par Safari) ne trieront pas le tableau et retourneront [3, 1, 4, 1, 5, 9], tandis que SpiderMonkey (utilis par Firefox) retournera le tableau tri par ordre croissant, soit [1, 1, 3, 4, 5, 9].
Cependant, si la fonction compareFn est modifie pour retourner -1 ou 0 :
const arr = [3, 1, 4, 1, 5, 9];
const compareFn = (a, b) => (a > b ? -1 : 0);
arr.sort(compareFn);
V8 et JavaScriptCore le trient alors par ordre dcroissant, comme [9, 5, 4, 3, 1, 1], tandis que SpiderMonkey le retourne tel quel : [3, 1, 4, 1, 5, 9].
En raison de cette incohrence d'implmentation, il est toujours conseill de s'assurer que votre comparateur est bien form en respectant les cinq contraintes.
sort() sur des tableaux creuxLes cases vides sont dplaces la fin du tableau.
console.log(["a", "c", , "b"].sort()); // ['a', 'b', 'c', empty]
console.log([, undefined, "a", "b"].sort()); // ["a", "b", undefined, empty]
sort() sur des objets qui ne sont pas des tableauxLa mthode sort() lit la proprit length de this. Elle collecte ensuite toutes les proprits cl entire existantes dans l'intervalle de 0 length - 1, les trie, puis les rcrit. S'il manque des proprits dans l'intervalle, les proprits finales correspondantes sont supprimes, comme si les proprits inexistantes taient tries vers la fin.
const objetSimilaireTableau = {
length: 3,
unrelated: "foo",
0: 5,
2: 4,
};
console.log(Array.prototype.sort.call(objetSimilaireTableau));
// { '0': 4, '1': 5, length: 3, unrelated: 'foo' }
| Spcification |
|---|
| ECMAScript 2027 LanguageSpecification # sec-array.prototype.sort |
ArrayArray.prototype.reverse()Array.prototype.toSorted()String.prototype.localeCompare()TypedArray.prototype.sort()Array.prototype.sort avec un comportement moderne (tri stable) dans core-js (angl.)Array.prototype.sort (angl.) sur v8.dev (2019)Array.prototype.sort (angl.) par Mathias BynensCette page a t modifie le 6 nov. 2025 par les contributeurices du MDN.
Arrayat()concat()copyWithin()entries()every()fill()filter()find()findIndex()findLast()findLastIndex()flat()flatMap()forEach()includes()indexOf()join()keys()lastIndexOf()map()pop()push()reduce()reduceRight()reverse()shift()slice()some()sort()splice()toLocaleString()toReversed()toSorted()toSpliced()toString()unshift()values()with()[Symbol.iterator]()Object/FunctionObject.prototype.__defineGetter__()Object.prototype.__defineSetter__()Object.prototype.__lookupGetter__()Object.prototype.__lookupSetter__()Object.prototype.hasOwnProperty()Object.prototype.isPrototypeOf()Object.prototype.propertyIsEnumerable()Object.prototype.toLocaleString()Object.prototype.toString()Object.prototype.valueOf()Certaines parties de ce contenu sont protges par le droit d'auteur 19982026 des contributeurs individuels de mozilla.org. Contenu disponible sous une licence Creative Commons.
| Web Proxy Viewer | New URL | Original Page |