J'ai un tableau de chaînes que je dois trier en JavaScript, mais de manière non sensible à la casse. Comment faire ça?
javascript
sorting
case-insensitive
Jérôme Verstrynge
la source
la source
return a.localeCompare(b, 'en', {'sensitivity': 'base'});
toLowerCase()
alorslocaleCompare
que cela se fait déjà par défaut dans certains cas. Vous pouvez en savoir plus sur les paramètres à lui transmettre ici: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…items.sort(new Intl.Collator('en').compare)
pour de meilleures performances. (Voir MDN .)EDIT: Veuillez noter que j'ai écrit à l'origine pour illustrer la technique plutôt que d'avoir à l'esprit la performance. Veuillez également vous référer à la réponse @Ivan Krechetov pour une solution plus compacte.
la source
toLowerCase
deux fois sur chaque chaîne; serait plus efficace pour stocker des versions réduites de la chaîne dans des variables..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
Il est temps de revenir sur cette vieille question.
Vous ne devez pas utiliser de solutions sur lesquelles vous vous fondez
toLowerCase
. Ils sont inefficaces et ne fonctionnent tout simplement pas dans certaines langues (turc par exemple). Préférez ceci:Consultez la documentation pour la compatibilité du navigateur et tout ce qu'il y a à savoir sur l'
sensitivity
option.la source
la source
return a === b ? 0 : a > b ? 1 : -1;
["111", "33"]
, nous pourrions souhaiter qu'il revienne["111", "33"]
car 1 précède 3 dans l'ordre des codes de caractères. Cependant, la fonction dans cette réponse retournera["33", "111"]
car le nombre33
est inférieur au nombre111
."33" > "111" === true
et33 > 111 === false
. Cela fonctionne comme prévu.Vous pouvez également utiliser le nouveau
Intl.Collator().compare
, par MDN, il est plus efficace lors du tri des tableaux. L'inconvénient est qu'il n'est pas pris en charge par les anciens navigateurs. MDN déclare qu'il n'est pas du tout pris en charge dans Safari. Besoin de le vérifier, car il indique que celaIntl.Collator
est pris en charge.la source
Si vous souhaitez garantir le même ordre quel que soit l'ordre des éléments dans le tableau d'entrée, voici un tri stable :
la source
Normaliser le cas dans le
.sort()
avec.toLowerCase()
.la source
Vous pouvez également utiliser l'opérateur Elvis:
Donne:
La méthode localeCompare est probablement très bien cependant ...
Remarque: L'opérateur Elvis est un «opérateur ternaire» abrégé pour if if else, généralement avec affectation.
Si vous regardez le?: De côté, il ressemble à Elvis ...
c'est-à-dire au lieu de:
vous pouvez utiliser:
c'est-à-dire quand y est vrai, alors retourne 1 (pour l'affectation à x), sinon retourne 2 (pour l'affectation à x).
la source
x = y ? y : z
, vous pouvez le fairex = y ?: z
. Javascript n'a pas d'opérateur Elvis réel, mais vous pouvez l'utiliserx = y || z
de manière similaire.Les autres réponses supposent que le tableau contient des chaînes. Ma méthode est meilleure, car elle fonctionnera même si le tableau contient null, undefined ou d'autres non-chaînes.
Le
null
sera trié entre «nulk» et «nulm». Mais leundefined
sera toujours trié en dernier.la source
(''+notdefined) === "undefined"
ilArray.prototype.sort
: | parce que la partie sur(''+notdefined) === "undefined"
est vraiment vraie ... ce qui signifie que si vous inversez les -1 et 1 dans la fonction de tri pour inverser l'ordre, les tris non définis continuent jusqu'à la fin. Il doit également être pris en compte lors de l'utilisation de la fonction de comparaison en dehors du contexte d'un tri de tableau (comme je l'étais lorsque je suis tombé sur cette question).Array.prototype.sort
définition - quelques commentaires supplémentaires. Tout d'abord, il n'est pas nécessaire que(''+a)
- ECMAScript nécessitetoString()
d'être appelé sur les éléments avant de les passer dans compareFn. Deuxièmement, le fait queignoreCase
renvoie1
lors de la comparaison de chaînes égales (y compris les chaînes égales mais pour le cas) signifie que la spécification ne définit pas le résultat s'il y a des valeurs en double (ce sera probablement bien juste avec des échanges inutiles, je pense).undefined
c'est un cas particulier qui, pour tout x x <undefined et x> undefined, est à la fois faux . C'estundefined
toujours le dernier, est un sous-produit de l'implémentation de tri de sorte. J'ai essayé de changer le ('' + a) en un simple, mais cela échoue. je reçoisTypeError: a.toUpperCase is not a function
. Apparemment, iltoString
n'est pas appelé avant d'appeler compareFn.undefined
le compareFn n'est jamais appeléVersion ES6:
["Foo", "bar"].sort((a, b) => a.localeCompare(b, 'en', { sensitivity: 'base' }))
Source: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare
la source
À l'appui de la réponse acceptée, je voudrais ajouter que la fonction ci-dessous semble changer les valeurs du tableau d'origine à trier de sorte que non seulement elle triera les minuscules, mais les valeurs en majuscules seront également modifiées en minuscules. C'est un problème pour moi car même si je souhaite voir Marie à côté de marie, je ne souhaite pas que le cas de la première valeur Mary soit changé en minuscule.
Dans mes expériences, la fonction suivante de la réponse acceptée trie correctement mais ne change pas les valeurs.
la source
Cela peut être utile si vous avez du mal à comprendre:
http://jsfiddle.net/ianjamieson/wmxn2ram/1/
la source
Dans la fonction ci-dessus, si nous comparons simplement lorsque les deux valeurs minuscules a et b, nous n'aurons pas le joli résultat.
Exemple, si le tableau est [A, a, B, b, c, C, D, d, e, E] et que nous utilisons la fonction ci-dessus, nous avons exactement ce tableau. Cela n'a rien changé.
Pour avoir le résultat est [A, a, B, b, C, c, D, d, E, e], nous devons comparer à nouveau lorsque deux valeurs minuscules sont égales:
la source
J'ai enveloppé la première réponse dans un polyfill afin que je puisse appeler .sortIgnoreCase () sur des tableaux de chaînes
la source
Enveloppez vos cordes
/ /i
. C'est un moyen facile d'utiliser l'expression régulière pour ignorer le boîtierla source