Сортировка кириллических слов с ударением
У меня возникла проблема с сортировкой массива строк, написанных на кириллице (с ударением). Следующее решение сортирует строки с диакритическими знаками и без них отдельно в начале строки.
function sorting(){
let words = document.querySelectorAll(".dictionary");
let unsorted = [];
let collator = new Intl.Collator('ru', {sensitivity: 'base'});
words.forEach(s => {
unsorted.push(s.textContent);
});
unsorted.sort(collator.compare);
unsorted.forEach(s => {
document.write("<p>" + s + "</p>");
});
}
РЕДАКТИРОВАТЬ
Это массив перед сортировкой:[..., 'áвтор', ..., 'авиабилéт', ..., 'янтáрный', ..., 'Áвстрия', 'áвтор', 'автостóп'];
это после сортировки:["авиабилéт", "автостóп", ..., "янтáрный", ..., "Áвстрия", "áвтор"]
это то, что я хочу иметь['авиабилéт', 'Áвстрия', 'áвтор', 'автостóп', ..., 'янтáрный', ...];
2 ответа
После некоторого исследования я считаю, что это ошибка в области действия проекта ICU или библиотеки CLDR.
Поскольку символы с ударением обычно объединяются и сохраняются как один символ, кириллица "а" и латинский "а" с ударением становятся одним и тем же символом. Это делает стандартную сортировку неудачной.
В качестве обходного пути я предлагаю
- нормализовать регистр с
.toLowerCase()
- с помощью
.normalize('NFD')
развернуть отдельный символ в серию "базовый символ + символ ударения" - удалить любые диакритические сообщения
.replace()
- использовать стандарт
.sort()
Я считаю, что это должно работать.
Вы не предоставили sensitivity
в опциях. Вероятно, значение по умолчанию - вариант (я пробовал в консоли Chrome), а вам нужно "база"