Лексикографически отсортировать массив в javascript

Почему этот код

["Q", "fP", "AQ", "L"].sort((a,b) => a.localeCompare(b))

дать такой результат:

["AQ", "fP", "L", "Q"]

Я думал, что это даст мне вот это (а это то, что мне нужно):

["AQ", "L", "Q", "fP"]

Все прописные буквы идут перед строчными буквами chortle.ccsu.edu/java5/Notes/chap92/ch92_2.html

А почему ты так подумал? Это не имеет смысла.

Adam Orłowski 09.12.2018 00:32
["Q", "fP", "AQ", "L"].sort() даст вам такой вывод
zer0 09.12.2018 00:33

@AdamOrlov Все прописные буквы идут перед строчными chortle.ccsu.edu/java5/Notes/chap92/ch92_2.html

Rachid O 09.12.2018 00:36

Можно подумать, что a.localeCompare(b, "en", {sensitivity: 'case', caseFirst: "upper"}) подойдет ... но это не так.

Akrion 09.12.2018 01:00

@ RachidOussanaa - это порядок последовательности кода ASCII, а не лексиографический. Английский алфавит обычно представлен как AaBbCc и так далее, а не ABC… abc…

RobG 09.12.2018 01:19

@RobG, но это не то, что лексикографический порядок chortle.ccsu.edu/java5/Notes/chap92/ch92_2.html и quora.com/…

Rachid O 09.12.2018 01:27

@ RachidOussanaa - это определение лексикографического порядка специфично для Java и не является общепринятым. В словарях не упорядочиваются все слова, начинающиеся с заглавных букв, а затем все строчные. Они существуют веками. Так уж получилось, что в кодовой последовательности ASCII для буквенных символов заглавные буквы указаны перед строчными. localeCompare пытается решить эту проблему.

RobG 09.12.2018 01:36
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
5
7
3 933
3

Ответы 3

Не используйте localeCompare(), просто используйте sort() напрямую

let myArray = ["Q", "fP", "AQ", "L"];
myArray.sort();
console.info(myArray);

Интересно, что следующее работает в NodeJS, но не в браузере JavaScript. Это связано с тем, что стандарт ECMAScript не определяет, какой алгоритм сортировки использовать, поэтому каждый браузер и / или NodeJS должны указывать

let myArray = ["Q", "fP", "AQ", "L"];
myArray.sort((a, b) => a > b);
console.info(myArray);

Демо NodeJS

https://repl.it/@AnonymousSB/SO53688028

Документация

http://www.ecma-international.org/ecma-262/5.1/#sec-15.4.4.11

Ваш последний комментарий не имеет смысла. NodeJS и JavaScript основаны на ECMAScript, поэтому для встроенных методов не должно быть различий. Оба приведенных выше фрагмента сортируются с помощью «fP» после всех остальных строк в каждой реализации ECMAScript в браузере, которую я пробовал. Кроме того, (a, b) => a > b не будет выполнять последовательную сортировку, поскольку он вернет false (0), где a == b и где a < b, а не 0 и -1 соответственно, что он должен вернуть.

RobG 09.12.2018 01:33

Если функция сравнения не определена, следует использовать внутреннюю функцию sortCompare, которая эффективно использует < и >, поэтому используется абстрактный алгоритм реляционного сравнения, который возвращается к единицам кода, поэтому не зависит от реализации вообще. Демонстрация nodejs сортируется точно так же, как и браузеры.

RobG 09.12.2018 02:13

Я этого совсем не вижу. Запуск кода в вашей демонстрации сортируется как [ 'AQ', 'L', 'Q', 'Q', 'fP' ]. Строки в коде V8 реализуют сортировку по ECMA-262 с использованием < и >, которые сортируются по единицам кода, а не лексикографически (поскольку единицы кода ASCII не расположены в лексикографическом порядке). И, конечно же, `${a} < ${b}`, a > b должен быть `${a} < ${b}`, a < b.

RobG 09.12.2018 12:33

Потому что, как я сказал ранее, ваша функция сортировки не работает. Просто отсортируйте его как myArray.sort(), и результат будет одинаковым. Вы получите идентичные результаты, если исправите функцию сортировки как return a < b? -1 : a > b? 1 : 0;, что и делает встроенная функция сортировки.

RobG 09.12.2018 12:52

Не используйте localeCompare(), просто используйте sort() напрямую. Как показано ниже:

["Q", "fP", "AQ", "L"].sort();

Попробуй это:

let myArray = ["Q", "fP", "AQ", "L"];
myArray.sort((a, b) => a > b ? 1 : -1);
console.info(myArray);

Другие вопросы по теме