porównywanie alfabetycznie 2 ciągów do celów sortowania

105

Próbuję porównać alfabetycznie 2 ciągi do celów sortowania. Na przykład chcę mieć czek logiczny, taki jak if('aaaa' < 'ab'). Próbowałem, ale nie daje to poprawnych wyników, więc myślę, że to nie jest właściwa składnia. Jak to zrobić w jQuery lub Javascript?

w tym samym wieku
źródło
Tak to robisz. Jakiego wyniku oczekujesz? Wyrażenie 'aaaa' < 'ab'zwraca true. <! - fałszywa edycja w celu usunięcia głosu ->
Guffa

Odpowiedzi:

122

Przyjrzyjmy się niektórym przypadkom testowym - spróbuj uruchomić następujące wyrażenia w konsoli JS:

"a" < "b"

"aa" < "ab"

"aaa" < "aab"

Wszystkie zwracają prawdę.

JavaScript porównuje łańcuchy znak po znaku, a „a” występuje przed „b” w alfabecie - stąd mniej niż.

W twoim przypadku tak to działa -

1. " Aaa" < " B"

porównuje pierwsze dwa znaki „a” - wszystkie równe, przejdźmy do następnego znaku.

2. "a aa" < "a b "

porównuje drugie znaki „a” z „b” - whoop! „a” występuje przed „b”. Zwraca prawdę.

Lix
źródło
2
dyskusja na temat znaków specjalnych, takich jak Č, č, Š, š, Ž, ž, patrz stackoverflow.com/questions/6909126/…
dsdsdsdsd
4
Imponujące, że jest to wbudowane natywnie!
Slava Knyazev
11
Coś, o czym należy pamiętać, to wielkie litery. "a" < "b" === true "a" < "B" === false.
Ted van Riel
141

Mówisz, że porównanie służy do sortowania. Zamiast tego proponuję:

"a".localeCompare("b");

Zwraca -1ponieważ "a" < "b", 1albo 0inaczej, jak trzeba do Array.prototype.sort ()

Pamiętaj, że sortowanie zależy od lokalizacji. Np. W języku niemieckim äjest wariantem a, więc "ä".localeCompare("b", "de-DE")zwraca -1. W języku szwedzkim äto jedna z ostatnich liter alfabetu, więc "ä".localeCompare("b", "se-SE")zwraca1 .

Bez drugiego parametru do localeCompareużywane są ustawienia regionalne przeglądarki. Z mojego doświadczenia wynika, że ​​nigdy nie jest to, czego chcę, ponieważ wtedy będzie sortowany inaczej niż serwer, który ma stałe ustawienia regionalne dla wszystkich użytkowników.

Peter V. Mørch
źródło
6
+1 również warto wspomnieć, że jest to również dobre dla przypadków ( "aa".localeCompare("ab")== "aa" .localeCompare ("Ab") dla każdej lokalizacji, o której przychodzi mi do głowy) i działa nawet w starszych wersjach IE. Powinna być zaakceptowana odpowiedź!
user56reinstatemonica8
1
+1 dla Piotra; Jest to bardziej zgodne z tym, jak działa sortowanie tablic JavaScript, więc jest bardziej przydatne i myślę, że jest to bardziej to, o co prosił OP.
Uroczyste zamknięcie
Przypuszczam, że to powinna być właściwa odpowiedź. Jedyny sposób na wykonanie alfabetycznego ( nie Unicode ) porównania łańcuchów.
Limbo
Wydawało się, że to naprawdę działa, nawet w przypadku wartości alfanumerycznych. Dzięki.
Joshua Pinter
30

Pamiętaj tylko, że w porównaniu ciągów znaków, takich jak „x”> „X”, rozróżniana jest wielkość liter

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

Możesz użyć .toLowerCase()do porównania bez rozróżniania wielkości liter.

Sielu
źródło
8

"a".localeCompare("b")powinien faktycznie powrócić, -1ponieważ asortował wcześniejb

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

Shalom Friss
źródło
1
Jeśli miałeś na myśli komentarz do mojej odpowiedzi, masz rację. Moja odpowiedź kiedyś niepoprawnie pokazywała wynik jako 1, więc poprawiłem to.
Peter V. Mørch
3

Powiedzmy, że mamy tablicę obiektów:

{ name : String }

następnie możemy posortować naszą tablicę w następujący sposób:

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

Uwaga: Uważaj na duże litery, może być konieczne rzutowanie ciągu na małe ze względu na cel.

Eray Xx
źródło
Funkcja używana do sortowania ma zwrócić 0, jeśli są równe. Ta funkcja zwraca tylko -1 lub 1.
Steve