сравнение двух строк в алфавитном порядке для сортировки

105

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

одного возраста
источник
2
Вы видели stackoverflow.com/questions/1134976/… ?
j08691
Вот как ты это делаешь. Какого результата вы ожидаете? Выражение 'aaaa' < 'ab'возвращается true. <! - ложное редактирование для удаления голоса ->
Guffa

Ответы:

123

Давайте посмотрим на некоторые тестовые примеры - попробуйте запустить следующие выражения в консоли JS:

"a" < "b"

"aa" < "ab"

"aaa" < "aab"

Все вернулось верно.

JavaScript сравнивает строки посимвольно, и «a» стоит перед «b» в алфавите - следовательно, меньше чем.

В вашем случае это работает так -

1. « Ааа» < « б»

сравнивает первые два символа "a" - все равны, давайте перейдем к следующему символу.

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

сравнивает вторые символы «а» с «б» - ох! «а» стоит перед «б». Возвращает истину.

Lix
источник
2
для обсуждения специальных символов, таких как Č, č, Š, š, Ž, ž, см. stackoverflow.com/questions/6909126/…
dsdsdsdsd 05
4
Впечатляет, что это изначально встроено!
Слава Князев
11
Что-то, что нужно иметь в виду, это заглавные буквы. "a" < "b" === true "a" < "B" === false.
Ted van Riel
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, поэтому это более полезно, и я думаю, что это больше то, о чем просил OP.
Торжественное закрытие
Полагаю, это должен быть правильный ответ. Единственный способ сделать сравнение строк в алфавитном порядке ( не в Unicode ).
Limbo
Похоже, это действительно помогло даже для буквенно-цифровых значений. Спасибо.
Джошуа Пинтер
30

Просто помните, что сравнение строк, например "x"> "X", чувствительно к регистру.

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

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

Сиелу
источник
8

"a".localeCompare("b")должен действительно вернуться, -1так как aсортирует доb

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

Шалом Фрисс
источник
1
Если вы имели в виду это как комментарий к моему ответу, вы правы. В моем ответе результат неправильно отображался как 1, поэтому я исправил это.
Peter V. Mørch
3

Допустим, у нас есть массив объектов:

{ name : String }

тогда мы можем отсортировать наш массив следующим образом:

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

Примечание: будьте осторожны с заглавными буквами, вам может потребоваться перевести строку в нижний регистр из-за вашей цели.

Eray Xx
источник
Функция, используемая для сортировки, должна возвращать 0, если они равны. Эта функция возвращает только -1 или 1.
Стив