Фильтр Angular js «упорядочить по» не работает для одного символа

Я использую порядок angularjs по фильтру для сортировки json. В соответствии с порядком предпочтения нижний регистр следует заглавным, но это не работает для одного символа. Может ли кто-нибудь помочь в этом, чтобы узнать?

$scope.friends = [
      {name: 'A'},
      {name: 'a'},
      {name: 'B'},
      {name: 'b'},
      {name: 'C'},
      {name: 'c'}
    ];
<table class="friends">
    <tr>
      <th>Name</th>
    </tr>
    <tr ng-repeat="friend in friends | orderBy:'name'">
      <td>{{friend.name}}</td>
    </tr>
  </table>

Результат :

Name
====
A
a
B
b
C
c

person Indhu    schedule 05.04.2017    source источник


Ответы (2)


Попробуйте это решение только для отдельных символов:

angular.module('app', []).controller('MyController', ['$scope', function($scope) {
     $scope.friends = [
      {name: 'A'},
      {name: 'a'},
      {name: 'B'},
      {name: 'b'},
      {name: 'C'},
      {name: 'c'}
    ];
}]).filter('customOrderBy', function(){
  return function(input, name)
  {
    var result = []
    for(var item of input)
    {
      var prop = item[name];
      var toUpper = prop.toUpperCase().charCodeAt(0);      
      result.push({item, code: toUpper + (prop.toLowerCase() == prop ? 0 : 1)});      
    }
    return result.sort(function(a, b){return a.code > b.code ? 1 : (a.code == b.code ? 0 : -1);}).map(function(x) { return x.item; });         
  }
})
<script src="//code.angularjs.org/snapshot/angular.min.js"></script>

<body ng-app="app">
  <div ng-controller="MyController">
<table class="friends">
    <tr>
      <th>Name</th>
    </tr>
    <tr ng-repeat="friend in friends | customOrderBy: 'name'">
      <td>{{friend.name}}</td>
    </tr>
  </table>
</div>
</body>

person Slava Utesinov    schedule 05.04.2017
comment
работает нормально. Спасибо. Но я добавляю с некоторым символом изменение приоритета. Если я хочу сделать с несколькими символами и одним символом, как мне кодировать? - person Indhu; 05.04.2017
comment
В случае нескольких символов, вы должны просто сравнить их по одному, реализуя логику, представленную в моем ответе, или свою собственную. - person Slava Utesinov; 05.04.2017

Вы можете попробовать этот пользовательский фильтр, как показано ниже?

<body ng-app="MyApp">
   <div ng-controller="MyCtrl">
       <table class="friends">
          <tr>
             <th>Name</th>
          </tr>
         <tr ng-repeat="friend in friends | localeOrderBy:'name'">
            <td>{{friend.name}}</td>
         </tr>
       </table>
   </div>
</body>


app.filter("localeOrderBy", [function () {
    return function (array, sortPredicate, reverseOrder) {
        if (!Array.isArray(array)) return array;
        if (!sortPredicate) return array;

        var isString = function (value) {
            return (typeof value === "string");
        };

        var isNumber = function (value) {
            return (typeof value === "number");
        };

        var isBoolean = function (value) {
            return (typeof value === "boolean");
        };

        var arrayCopy = [];
        angular.forEach(array, function (item) {
            arrayCopy.push(item);
        });

        arrayCopy.sort(function (a, b) {
            var valueA = a[sortPredicate];
            var valueB = b[sortPredicate];

            if (isString(valueA))
                return !reverseOrder ? valueA.localeCompare(valueB) : valueB.localeCompare(valueA);

            if (isNumber(valueA) || isBoolean(valueA))
                return !reverseOrder ? valueA - valueB : valueB - valueA;

            return 0;
        });

        return arrayCopy;
    }
}]);
person Immanuel Kirubaharan    schedule 05.04.2017
comment
Я внес некоторые изменения в свой код, пожалуйста, проверьте и дайте мне знать - person Immanuel Kirubaharan; 05.04.2017