Сортировка кириллических слов с ударением

У меня возникла проблема с сортировкой массива строк, написанных на кириллице (с ударением). Следующее решение сортирует строки с диакритическими знаками и без них отдельно в начале строки.

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.

Поскольку символы с ударением обычно объединяются и сохраняются как один символ, кириллица "а" и латинский "а" с ударением становятся одним и тем же символом. Это делает стандартную сортировку неудачной.

В качестве обходного пути я предлагаю

  1. нормализовать регистр с .toLowerCase()
  2. с помощью .normalize('NFD') развернуть отдельный символ в серию "базовый символ + символ ударения"
  3. удалить любые диакритические сообщения .replace()
  4. использовать стандарт .sort()

Я считаю, что это должно работать.

Вы не предоставили sensitivity в опциях. Вероятно, значение по умолчанию - вариант (я пробовал в консоли Chrome), а вам нужно "база"

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