comparer 2 chaînes par ordre alphabétique à des fins de tri

105

J'essaie de comparer 2 chaînes par ordre alphabétique à des fins de tri. Par exemple, je veux avoir une vérification booléenne comme if('aaaa' < 'ab'). Je l'ai essayé, mais cela ne me donne pas de bons résultats, donc je suppose que ce n'est pas la bonne syntaxe. Comment faire cela dans jquery ou Javascript?

même ancien
la source
2
Avez-vous vu stackoverflow.com/questions/1134976/... ?
j08691
C'est comme ça que tu le fais. Quel résultat attendez-vous? L'expression 'aaaa' < 'ab'revient true. <! - fausse modification pour supprimer le vote ->
Guffa

Réponses:

122

Regardons quelques cas de test - essayez d'exécuter les expressions suivantes dans votre console JS:

"a" < "b"

"aa" < "ab"

"aaa" < "aab"

Tous retournent vrai.

JavaScript compare les chaînes caractère par caractère et "a" vient avant "b" dans l'alphabet - donc moins de.

Dans votre cas, cela fonctionne comme ça -

1 . " Un aaa" < " a b"

compare les deux premiers caractères "a" - tous égaux, passons au caractère suivant.

2. "a un aa" < "a b "

compare les seconds caractères "a" et "b" - whoop! "a" vient avant "b". Renvoie vrai.

Lix
la source
2
pour une discussion sur les caractères spéciaux tels que Č, č, Š, š, Ž, ž, voir stackoverflow.com/questions/6909126
...
4
Impressionnant que cela soit intégré de manière native!
Slava Knyazev
11
Il faut garder à l'esprit les capitales. "a" < "b" === true "a" < "B" === false.
Ted van Riel
141

Vous dites que la comparaison sert à des fins de tri. Ensuite, je suggère à la place:

"a".localeCompare("b");

Il retourne -1depuis "a" < "b", 1ou 0autrement, comme vous en avez besoin pour Array.prototype.sort ()

Gardez à l'esprit que le tri dépend des paramètres régionaux. Par exemple, en allemand, äest une variante de a, donc "ä".localeCompare("b", "de-DE")renvoie -1. En suédois, äest l'une des dernières lettres de l'alphabet, donc "ä".localeCompare("b", "se-SE")renvoie 1.

Sans le deuxième paramètre à localeCompare, les paramètres régionaux du navigateur sont utilisés. Ce qui, d'après mon expérience, n'est jamais ce que je veux, car alors le tri sera différent de celui du serveur, qui a un paramètre régional fixe pour tous les utilisateurs.

Peter V. Mørch
la source
6
+1 vaut également la peine de mentionner que cela convient également aux cas ( "aa".localeCompare("ab")== "aa" .localeCompare ("Ab") pour tous les paramètres régionaux auxquels je pense) et fonctionne même dans les anciennes versions d'IE. Devrait être la réponse acceptée!
user56reinstatemonica8
1
+1 pour Peter; C'est de toute façon plus compatible avec le fonctionnement du tri par tableau Javascript, donc c'est plus utile, et je pense que c'est plus ce que l'OP demandait.
Grandclosing
Je suppose que cela devrait être la bonne réponse. La seule façon de comparer les chaînes alphabétiques (et non Unicode ).
Limbo
Cela semblait vraiment faire l'affaire, même pour les valeurs alphanumériques. Merci.
Joshua Pinter
30

N'oubliez pas que la comparaison de chaînes comme "x"> "X" est sensible à la casse

"aa" < "ab" //true
"aa" < "Ab" //false

Vous pouvez utiliser .toLowerCase()pour comparer sans respecter la casse.

Sielu
la source
8

"a".localeCompare("b")devrait en fait revenir -1depuis les atris avantb

http://www.w3schools.com/jsref/jsref_localecompare.asp

Shalom Friss
la source
1
Si vous vouliez dire ceci comme un commentaire à ma réponse, vous avez raison. Ma réponse indiquait à tort le résultat comme 1, alors j'ai corrigé cela.
Peter V.Mørch
3

Disons que nous avons un tableau d'objets:

{ name : String }

alors nous pouvons trier notre tableau comme suit:

array.sort(function(a, b) {
    var orderBool = a.name > b.name;
    return orderBool ? 1 : -1;
});

Remarque: faites attention aux lettres majuscules, vous devrez peut-être convertir votre chaîne en minuscules en raison de votre objectif.

Eray Xx
la source
La fonction utilisée pour le tri est censée renvoyer 0 s'ils sont égaux. Cette fonction ne renvoie que -1 ou 1.
Steve