порівняння 2 рядків в алфавітному порядку для цілей сортування


105

Я намагаюся порівняти 2 рядки в алфавітному порядку для сортування. Наприклад, я хочу мати булеву перевірку if('aaaa' < 'ab'). Я спробував це, але це не дає мені правильних результатів, тому я думаю, що це не правильний синтаксис. Як це зробити в jquery або Javascript?



Ось як ви це робите. Якого результату ви очікуєте? Вираз 'aaaa' < 'ab'повертається true. <! - помилкова редакція, щоб видалити голосування ->
Guffa

Відповіді:


122

Давайте розглянемо деякі тестові випадки - спробуйте виконати наступні вирази на консолі JS:

"a" < "b"

"aa" < "ab"

"aaa" < "aab"

Всі повертаються правдою.

JavaScript порівнює символи рядків за символом, а "a" йде перед "b" в алфавіті - значить, менше, ніж.

У вашому випадку це працює так -

1. « Ааа» < « б»

порівнює перші два символи "a" - всі рівні, давайте перейдемо до наступного символу.

2. «А аа» < «а б »

порівнює другі символи "a" проти "b" - whoop! "a" приходить перед "b". Повертає істину.


2
для обговорення спеціальних символів , таких як C, C, S, S, Z, Z, см stackoverflow.com/questions/6909126 / ...
dsdsdsdsd

4
Вражає те, що це вбудовано у самому справі!
Слава Князєв

11
Щось слід пам’ятати, були столиці. "a" < "b" === true "a" < "B" === false.
Тед ван Ріель

141

Ви кажете, що порівняння призначене для сортування. Тоді я пропоную замість цього:

"a".localeCompare("b");

Вона повертає -1так "a" < "b", 1або 0інакше, як вам потрібно для Array.prototype.sort ()

Майте на увазі, що сортування залежить від місцевості. Наприклад, німецькою мовою, äце варіант a, тому "ä".localeCompare("b", "de-DE")повертається -1. Шведською мовою äє одна з останніх літер в алфавіті, тому "ä".localeCompare("b", "se-SE")повертається 1.

Без другого параметра до localeCompare, використовується локальний код браузера. Що, на мій досвід, ніколи не є тим, чого я хочу, бо тоді воно буде сортувати інакше, ніж сервер, який має фіксовану локаль для всіх користувачів.


6
+1 також варто зазначити, що це добре також і для випадків ( "aa".localeCompare("ab")== "aa" .localeCompare ("Ab") для будь-якого я можу придумати) та працює навіть у старих версіях IE. Повинна бути прийнята відповідь!
user56reinstatemonica8

1
+1 для Петра; Це більше сумісне з тим, як сортування масиву Javascript працює в будь-якому випадку, тому воно є більш корисним, і я думаю, що це більше того, що просив ОП.
Величне завершення

Я гадаю, це повинна бути правильна відповідь. Єдиний спосіб порівняння алфавітних ( не Unicode ) рядків.
Лімбо

Це, здавалося, справді робило трюк, навіть для буквено-цифрових значень. Дякую.
Джошуа Пінтер

30

Пам'ятайте лише, що порівняння рядків типу "x"> "X" залежить від регістру

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

Ви можете використовувати .toLowerCase()для порівняння без чутливості до регістру.



3

Скажімо, у нас є масив об’єктів:

{ name : String }

то ми можемо сортувати наш масив наступним чином:

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

Примітка. Будьте уважні до верхніх літер, можливо, вам потрібно буде передати рядки в малі регістри відповідно до вашого призначення.


Функція, яка використовується для сортування, повинна повертати 0, якщо вони рівні. Ця функція повертає лише -1 або 1.
Стів
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.