Почему этот код
["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
["Q", "fP", "AQ", "L"].sort() даст вам такой вывод
@AdamOrlov Все прописные буквы идут перед строчными chortle.ccsu.edu/java5/Notes/chap92/ch92_2.html
Можно подумать, что a.localeCompare(b, "en", {sensitivity: 'case', caseFirst: "upper"}) подойдет ... но это не так.
@ RachidOussanaa - это порядок последовательности кода ASCII, а не лексиографический. Английский алфавит обычно представлен как AaBbCc и так далее, а не ABC… abc…
@RobG, но это не то, что лексикографический порядок chortle.ccsu.edu/java5/Notes/chap92/ch92_2.html и quora.com/…
@ RachidOussanaa - это определение лексикографического порядка специфично для Java и не является общепринятым. В словарях не упорядочиваются все слова, начинающиеся с заглавных букв, а затем все строчные. Они существуют веками. Так уж получилось, что в кодовой последовательности ASCII для буквенных символов заглавные буквы указаны перед строчными. localeCompare пытается решить эту проблему.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Не используйте 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);
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 соответственно, что он должен вернуть.
Если функция сравнения не определена, следует использовать внутреннюю функцию sortCompare, которая эффективно использует < и >, поэтому используется абстрактный алгоритм реляционного сравнения, который возвращается к единицам кода, поэтому не зависит от реализации вообще. Демонстрация nodejs сортируется точно так же, как и браузеры.
Я этого совсем не вижу. Запуск кода в вашей демонстрации сортируется как [ 'AQ', 'L', 'Q', 'Q', 'fP' ]. Строки в коде V8 реализуют сортировку по ECMA-262 с использованием < и >, которые сортируются по единицам кода, а не лексикографически (поскольку единицы кода ASCII не расположены в лексикографическом порядке). И, конечно же, `${a} < ${b}`, a > b должен быть `${a} < ${b}`, a < b.
Потому что, как я сказал ранее, ваша функция сортировки не работает. Просто отсортируйте его как myArray.sort(), и результат будет одинаковым. Вы получите идентичные результаты, если исправите функцию сортировки как return a < b? -1 : a > b? 1 : 0;, что и делает встроенная функция сортировки.
Не используйте localeCompare(), просто используйте sort() напрямую. Как показано ниже:
["Q", "fP", "AQ", "L"].sort();
Попробуй это:
let myArray = ["Q", "fP", "AQ", "L"];
myArray.sort((a, b) => a > b ? 1 : -1);
console.info(myArray);
А почему ты так подумал? Это не имеет смысла.