AngularJS и orderby в ng-repeat со специальными символами

У меня возникли проблемы с упорядочением строк, содержащих символы, которые не находятся в английском алфавите (š, č, ž,..)

Вот скрипка: http://fiddle.jshell.net/vhhgh/

Буквы от словенского алфавита.

Ответ 1

Это было какое-то время, но я нашел другое решение: fiddle

HTML:

<div ng-app='test'>
  <h2>Users</h2>
  <div ng-controller="UsersCtrl">
    <ul>
      <li ng-repeat="user in users | localeCompareString">
        {{user.surname}} {{user.name}}
      </li>
    </ul>
  </div>
</div>

JS:

(function(angular) {
  'use strict';
  var test=angular.module('test',[])
.controller('UsersCtrl', ['$scope',function($scope) {
  $scope.users = [
    {name:'Ben', surname:'Živkovič'},
    {name:'Ken', surname:'AlGore'},
    {name:'Erica', surname:'Červ'},
    {name:'Jane', surname:'Šinigoj'},
    {name:'Kevin', surname:'Sort'},
    {name:'Roger', surname:'Willson'},
    {name:'Kim', surname:'Zorro'}
];
}]).filter('localeCompareString',function(){
    return function (items) {
         //window.console.log(items);
        items.sort(function (a, b) {
            return a.surname.localeCompare(b.surname);
        });
        return items;
      }; 
});

})(window.angular);        

Ответ 2

Заказ массивов строк с "чужими" буквами не так прост, как вы думаете. Фактически, это может быть правильная боль в..., чтобы получить право. Проблема сводится к тому, что в кодировке Юникод (в значительной степени) присутствуют все символы, поэтому универсальная лексикографическая сортировка невозможна, поскольку разные страны имеют разные способы, по которым они ожидают обработки сортировки.

Чтобы обойти это, я нашел TCollator, небольшую библиотеку, нацеленную на исправление этой проблемы, очень полезную.

Ответ 3

Вы можете сравнить две строки с методом String.localeCompare(). Затем легко создать собственный фильтр для сортировки массива:

MyApp.filter('myOrderBy', function () {
return function (array, property, reverse) {
    var result = array.sort(function (object1, object2) {
        if (angular.isUndefined(property)) {
            return object1.localeCompare(object2);
        }

        return object1[property].localeCompare(object2[property]);
    });

    return reverse ? result.reverse() : result;
};

});

Ответ 4

Начиная с AngularJS 1.5.7, orderBy принимает необязательную функцию компаратора. Документы содержат пример, в котором используется локализированный компаратор.