343 votes

Comment effectuer un tri insensible à la casse en JavaScript ?

J'ai un tableau de chaînes de caractères que je dois trier en JavaScript, mais sans tenir compte de la casse. Comment faire ?

556voto

Ivan Krechetov Points 6465

En (presque :) une seule ligne

["Foo", "bar"].sort(function (a, b) {
    return a.toLowerCase().localeCompare(b.toLowerCase());
});

Ce qui entraîne

[ 'bar', 'Foo' ]

Alors que

["Foo", "bar"].sort();

résulte en

[ 'Foo', 'bar' ]

10 votes

N'oubliez pas que les options avancées de localeCompare ne sont pas encore prises en charge par toutes les plateformes/navigateurs. Je sais qu'elles ne sont pas utilisées dans cet exemple, mais je voulais juste les ajouter pour plus de clarté. Voir MDN pour plus d'informations

148 votes

Si vous voulez impliquer localeCompare(), vous pouvez simplement utiliser su la possibilité d'être insensible à la casse, par exemple : return a.localeCompare(b, 'en', {'sensitivity': 'base'});

4 votes

+1 pour ne pas avoir appelé toLowerCase() quand localeCompare le fait déjà par défaut dans certains cas. Vous pouvez en savoir plus sur les paramètres à lui passer ici : developer.mozilla.org/fr/US/docs/Web/JavaScript/Référence/

66voto

ron tornambe Points 4483
myArray.sort(
  function(a, b) {
    if (a.toLowerCase() < b.toLowerCase()) return -1;
    if (a.toLowerCase() > b.toLowerCase()) return 1;
    return 0;
  }
);

EDITAR: Veuillez noter que j'ai écrit ceci à l'origine pour illustrer la technique plutôt que d'avoir les performances en tête. Veuillez également vous référer à la réponse de @Ivan Krechetov pour une solution plus compacte.

4 votes

Cela peut appeler toLowerCase deux fois sur chaque chaîne ; il serait plus efficace de stocker les versions abaissées de la chaîne dans des variables.

0 votes

Vrai et merci. J'ai écrit ceci dans un souci de clarté, pas de performance. Je suppose que je devrais le noter.

1 votes

@Jacob Pour être juste, la réponse acceptée a le même problème de base : elle peut éventuellement appeler .toLowerCase() plusieurs fois pour chaque élément du tableau. Par exemple, 45 appels à la fonction de comparaison lors du tri de 10 éléments dans l'ordre inverse. var i = 0; ["z","y","x","w","v","u","t","s","r","q"].sort(function (a, b) {++i; return a.toLowerCase().localeCompare(b.toLowerCase());}); console.log("Calls to Compare: " + i); // i === 45

29voto

Niet the Dark Absol Points 154811
arr.sort(function(a,b) {
    a = a.toLowerCase();
    b = b.toLowerCase();
    if (a == b) return 0;
    if (a > b) return 1;
    return -1;
});

2 votes

Ou return a === b ? 0 : a > b ? 1 : -1;

1 votes

Cela ne fonctionnera probablement pas comme prévu pour les chaînes de caractères qui représentent des nombres. Les opérateurs arithmétiques utiliseront la sémantique des nombres au lieu des chaînes de caractères. Par exemple, si nous avons ["111", "33"] on pourrait vouloir qu'il revienne ["111", "33"] car le 1 vient avant le 3 dans l'ordre des codes de caractères. Cependant, la fonction dans cette réponse retournera ["33", "111"] parce que le nombre 33 est inférieur au nombre 111 .

0 votes

@AustinDavis "33" > "111" === true y 33 > 111 === false . Il fonctionne comme prévu.

12voto

Aalex Gabi Points 333

Si vous voulez garantir le même ordre quel que soit l'ordre des éléments dans le tableau d'entrée, voici un stable tri :

myArray.sort(function(a, b) {
    /* Storing case insensitive comparison */
    var comparison = a.toLowerCase().localeCompare(b.toLowerCase());
    /* If strings are equal in case insensitive comparison */
    if (comparison === 0) {
        /* Return case sensitive comparison instead */
        return a.localeCompare(b);
    }
    /* Otherwise return result */
    return comparison;
});

5voto

squint Points 28293

Normaliser l'affaire dans le .sort() con .toLowerCase() .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X