Подтвердить что ты не робот

Сортировка javascript с unicode

Существует множество примеров для сортировки некоторого массива JSON по некоторому свойству (т.е. "title" ) Мы используем функцию сравнения, подобную этой:

function sortComparer(a, b) {
        if (a.title == b.title)
            return 0;
        return a1 > b1 ? 1 : -1;
    }

Проблема в том, что порядок сербского латинского алфавита выглядит как "A, B, C, Č, Ć, D,..." При использовании sortComparer выше я получаю D, отсортированный до "Č" или "Ć". Любая идея, как сортировать уважение к текущему языку культуры?

4b9b3361

Ответ 1

Если локаль в вашей системе настроена правильно, вы можете использовать метод localeCompare вместо оператора больше, чем для сравнения строк - этот метод известен локали.

function sortComparer(a,b){
    return a.title.localeCompare(b.title)
};

Ответ 2

Вы пробовали функцию String localeCompare():

function sortComparer(a, b) {
   return a.title.localeCompare(b.title);
}

Отказ от ответственности: Я действительно не тестировал, чтобы увидеть, что localeCompare() делает с теми неанглийскими символами, и MDN тоже не говорит. (Он говорит, что toLocaleLowerCase() относится к текущему языку, поэтому можно надеяться, что localeCompare() будет таким же, но все же...)

Ответ 3

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

  • Создайте массив с пользовательским порядком алфавитов:

    var alphabets = ["A", "B", "C", "Č", "Ć", "D","Dž","Đ","E","F","G","H","I","J","K","L","Lj","M","N","Nj","O","P","R","S", "ÛŒ","T","U","V","Z","Ž"];

  • Создайте список тестового массива:

    var testArrray = ["B2","D6","A1","Ć5","Č4","C3"];

  • Создайте имя функции сортировки:

    function OrderFunc(){
              testArrray.sort(function (a, b) {
                  return CharCompare(a, b, 0);
              });
          }
    
  • создайте функцию CharCompare (индекс: выберите "AAAB" перед "AAAC" ):

     function CharCompare(a, b, index) {
      if (index == a.length || index == b.length)
          return 0;
      //toUpperCase: isn't case sensitive
      var aChar = alphabets.indexOf(a.toUpperCase().charAt(index));
      var bChar = alphabets.indexOf(b.toUpperCase().charAt(index));
      if (aChar != bChar)
          return aChar - bChar
      else
          return CharCompare(a,b,index+1)
    

    }

  • Вызов OrderFunc для сортировки testArray (результат будет: A1, B2, C3, Č4, Ć5, D6).

Test Online

Удача