AngularJS和带有特殊字符的ng-repeat中的orderby

时间:2013-11-29 19:32:03

标签: angularjs localization sql-order-by

我在排序包含不在英文字母中的字符的字符串时遇到问题(š,č,ž,..)

这是小提琴:http://fiddle.jshell.net/vhhgh/

这些字母来自斯洛文尼亚字母。

4 个答案:

答案 0 :(得分:8)

已经有一段时间了,但我找到了其他解决方案: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);        

答案 1 :(得分:1)

使用“外国”字母排序字符串数组并不像您想象的那么容易。实际上,在......做出正确的努力可能是一种正确的痛苦。问题归结为Unicode字符集包含(几乎)存在的所有字符,因此不可能进行通用的词典排序,因为不同的国家都有不同的方式来预期处理排序。

为了解决这个问题,我发现TCollator是一个旨在解决这个问题的小型图书馆,非常有用。

答案 2 :(得分:1)

您可以使用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;
};

});

答案 3 :(得分:0)

从AngularJS 1.5.7开始,orderBy采用可选的比较器功能。 The docs包含一个涉及区域设置敏感的比较器的示例。