comparar 2 cadenas alfabéticamente para fines de clasificación

105

Estoy tratando de comparar 2 cadenas alfabéticamente para fines de clasificación. Por ejemplo, quiero tener una verificación booleana como if('aaaa' < 'ab'). Lo intenté, pero no me da los resultados correctos, así que supongo que no es la sintaxis correcta. ¿Cómo hago esto en jquery o Javascript?

mismo viejo
fuente
Asi es como lo haces. ¿Qué resultado esperas? La expresión 'aaaa' < 'ab'regresa true. <! - edición falsa para eliminar el voto ->
Guffa

Respuestas:

122

Veamos algunos casos de prueba: intente ejecutar las siguientes expresiones en su consola JS:

"a" < "b"

"aa" < "ab"

"aaa" < "aab"

Todos vuelven verdaderos.

JavaScript compara cadenas carácter por carácter y "a" viene antes de "b" en el alfabeto, por lo tanto, menos que.

En tu caso funciona así:

1. " Un aaa" < " un b"

compara los dos primeros caracteres "a" - todos iguales, pasemos al siguiente carácter.

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

compara los segundos caracteres "a" con "b" - ¡whoop! "a" viene antes que "b". Devuelve verdadero.

Lix
fuente
2
para obtener información sobre caracteres especiales como Č, č, Š, š, Ž, ž, consulte stackoverflow.com/questions/6909126/…
dsdsdsdsd
4
¡Impresionante que esté integrado de forma nativa!
Slava Knyazev
11
Algo a tener en cuenta serían las mayúsculas. "a" < "b" === true "a" < "B" === false.
Ted van Riel
141

Dice que la comparación es para fines de clasificación. Entonces sugiero en su lugar:

"a".localeCompare("b");

Vuelve -1desde "a" < "b", 1o de lo 0contrario, como lo necesita para Array.prototype.sort ()

Tenga en cuenta que la clasificación depende de la configuración regional. Por ejemplo, en alemán, äes una variante de a, por lo que "ä".localeCompare("b", "de-DE")vuelve -1. En sueco, äes una de las últimas letras del alfabeto, por lo que "ä".localeCompare("b", "se-SE")vuelve 1.

Sin el segundo parámetro localeCompare, se utiliza la configuración regional del navegador. Lo que en mi experiencia nunca es lo que quiero, porque entonces se clasificará de manera diferente al servidor, que tiene una configuración regional fija para todos los usuarios.

Peter V. Mørch
fuente
6
+1 también vale la pena mencionar que esto también está bien para los casos ( "aa".localeCompare("ab")== "aa" .localeCompare ("Ab") para cualquier configuración regional que se me ocurra) y funciona incluso en versiones antiguas de IE. ¡Debería ser la respuesta aceptada!
user56reinstatemonica8
1
+1 para Peter; Esto es más compatible con cómo funciona la ordenación de matrices de Javascript de todos modos, por lo que es más útil, y creo que es más de lo que pedía el OP.
Gran cierre el
Supongo que esta debería ser la respuesta correcta. La única forma de hacer una comparación de cadenas alfabética ( no Unicode ).
Limbo
Esto pareció funcionar realmente, incluso para valores alfanuméricos. Gracias.
Joshua Pinter
30

Solo recuerde que la comparación de cadenas como "x"> "X" distingue entre mayúsculas y minúsculas

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

Puede utilizar .toLowerCase()para comparar sin distinción entre mayúsculas y minúsculas.

Sielu
fuente
8

"a".localeCompare("b")debería volver -1ya que aordena antesb

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

Shalom Friss
fuente
1
Si quiso decir esto como un comentario a mi respuesta, tiene razón. Mi respuesta solía mostrar incorrectamente el resultado como 1, así que lo corrigí.
Peter V. Mørch
3

Digamos que tenemos una matriz de objetos:

{ name : String }

entonces podemos ordenar nuestra matriz de la siguiente manera:

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

Nota: tenga cuidado con las letras mayúsculas, es posible que deba convertir su cadena en minúsculas debido a su propósito.

Eray Xx
fuente
Se supone que la función utilizada para ordenar devuelve 0 si son iguales. Esta función solo devuelve -1 o 1.
Steve