У меня возникли проблемы с упорядочением строк, содержащих символы, которые не находятся в английском алфавите (š, č, ž,..)
Вот скрипка: http://fiddle.jshell.net/vhhgh/
Буквы от словенского алфавита.
У меня возникли проблемы с упорядочением строк, содержащих символы, которые не находятся в английском алфавите (š, č, ž,..)
Вот скрипка: http://fiddle.jshell.net/vhhgh/
Буквы от словенского алфавита.
Это было какое-то время, но я нашел другое решение: 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);
Заказ массивов строк с "чужими" буквами не так прост, как вы думаете. Фактически, это может быть правильная боль в..., чтобы получить право. Проблема сводится к тому, что в кодировке Юникод (в значительной степени) присутствуют все символы, поэтому универсальная лексикографическая сортировка невозможна, поскольку разные страны имеют разные способы, по которым они ожидают обработки сортировки.
Чтобы обойти это, я нашел TCollator, небольшую библиотеку, нацеленную на исправление этой проблемы, очень полезную.
Вы можете сравнить две строки с методом 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;
};
});
Начиная с AngularJS 1.5.7, orderBy принимает необязательную функцию компаратора. Документы содержат пример, в котором используется локализированный компаратор.