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?



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ę.


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.


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.



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.


Funkcja używana do sortowania ma zwrócić 0, jeśli są równe. Ta funkcja zwraca tylko -1 lub 1.
Steve
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.