comparar 2 strings alfabeticamente para fins de classificação

105

Estou tentando comparar 2 strings em ordem alfabética para fins de classificação. Por exemplo, eu quero ter uma verificação booleana como if('aaaa' < 'ab'). Eu tentei, mas não está dando resultados corretos, então acho que essa não é a sintaxe certa. Como faço isso em jquery ou Javascript?

o mesmo de sempre
fonte
É assim que se faz. Qual resultado você espera? A expressão 'aaaa' < 'ab'retorna true. <! - edição falsa para remover voto ->
Guffa

Respostas:

122

Vejamos alguns casos de teste - tente executar as seguintes expressões em seu console JS:

"a" < "b"

"aa" < "ab"

"aaa" < "aab"

Todos retornam verdadeiros.

JavaScript compara strings caractere por caractere e "a" vem antes de "b" no alfabeto - portanto, menos de.

No seu caso, funciona assim -

1 " Um aaa" < " uma b"

compara os dois primeiros caracteres "a" - todos iguais, vamos passar para o próximo caractere.

2 "a um aa" < "uma b "

compara os segundos caracteres "a" com "b" - uau! "a" vem antes de "b". Retorna verdadeiro.

Lix
fonte
2
para discussão sobre caracteres especiais, como Č, č, Š, š, Ž, ž, consulte stackoverflow.com/questions/6909126/…
dsdsdsdsd
4
Impressionante que isso seja integrado nativamente!
Slava Knyazev
11
Algo a ter em mente são as letras maiúsculas. "a" < "b" === true "a" < "B" === false.
Ted van Riel
141

Você diz que a comparação é para fins de classificação. Então eu sugiro em vez disso:

"a".localeCompare("b");

Ele retorna -1desde "a" < "b", 1ou de 0outra forma, como você precisa para Array.prototype.sort ()

Lembre-se de que a classificação depende do local. Por exemplo, em alemão, äé uma variante de a, então "ä".localeCompare("b", "de-DE")retorna -1. Em sueco, äé uma das últimas letras do alfabeto, então "ä".localeCompare("b", "se-SE")retorna 1.

Sem o segundo parâmetro para localeCompare, a localidade do navegador é usada. O que, na minha experiência, nunca é o que eu quero, porque então vai classificar de forma diferente do servidor, que tem um local fixo para todos os usuários.

Peter V. Mørch
fonte
6
+1 também vale a pena mencionar que isso é bom para casos também ( "aa".localeCompare("ab")== "aa" .localeCompare ("Ab") para qualquer local que eu possa pensar) e funciona até mesmo em versões antigas do IE. Deve ser a resposta aceita!
user56reinstatemonica8
1
1 para Peter; Isso é mais compatível com a forma como a ordenação de array Javascript funciona, então é mais útil, e acho que é mais o que o OP estava pedindo.
Grandclosing
Suponho que esta seja a resposta certa. A única maneira de fazer comparação de strings em ordem alfabética ( não Unicode ).
Limbo de
Isso parecia realmente funcionar, mesmo para valores alfanuméricos. Obrigado.
Joshua Pinter
30

Lembre-se de que a comparação de strings como "x"> "X" diferencia maiúsculas de minúsculas

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

Você pode usar .toLowerCase()para comparar sem distinção entre maiúsculas e minúsculas.

Sielu
fonte
8

"a".localeCompare("b")deve realmente retornar, -1pois aclassifica antesb

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

Shalom Friss
fonte
1
Se você quis dizer isso como um comentário à minha resposta, está certo. Minha resposta costumava mostrar incorretamente o resultado como 1, então eu corrigi isso.
Peter V. Mørch
3

Digamos que temos uma matriz de objetos:

{ name : String }

então podemos classificar nosso array da seguinte maneira:

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

Nota: Tenha cuidado com as letras maiúsculas, você pode precisar lançar sua string para minúsculas devido ao seu propósito.

Eray Xx
fonte
A função usada para classificação deve retornar 0 se eles forem iguais. Esta função retorna apenas -1 ou 1.
Steve