Angularjs 角度js过滤器';订购人';不适用于单个字符

Angularjs 角度js过滤器';订购人';不适用于单个字符,angularjs,angularjs-orderby,Angularjs,Angularjs Orderby,我使用angularjs order by filter对json进行排序。根据优先顺序,小写后接大写,但不适用于单个字符。有人能帮我找到答案吗 $scope.friends = [ {name: 'A'}, {name: 'a'}, {name: 'B'}, {name: 'b'}, {name: 'C'}, {name: 'c'} ]; <table class="friends"> <

我使用angularjs order by filter对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>

你能像下面那样尝试这个自定义过滤器吗

<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;
    }
}]);

名称
{{friend.name}
app.filter(“localeOrderBy”,[function(){
返回函数(数组、排序预测、反向排序){
if(!Array.isArray(Array))返回数组;
if(!sortPredicate)返回数组;
var isString=函数(值){
返回值(值的类型==“字符串”);
};
变量isNumber=函数(值){
返回值(值的类型==“数字”);
};
var isBoolean=函数(值){
返回值(值的类型==“布尔”);
};
var arrayCopy=[];
角度.forEach(数组、函数(项){
阵列复制推送(项目);
});
arrayCopy.sort(函数(a,b){
var valueA=a[sortPredicate];
var值b=b[sortPredicate];
如果(isString(valueA))
return!reverseOrder?valueA.localeCompare(valueB):valueB.localeCompare(valueA);
if(isNumber(valueA)| | isBoolean(valueA))
return!reverseOrder?valueA-valueB:valueB-valueA;
返回0;
});
返回阵列副本;
}
}]);

仅针对单个字符尝试此解决方案

angular.module('app',[]).controller('MyController',['$scope',function($scope){
$scope.friends=[
{name:'A'},
{name:'a'},
{name:'B'},
{name:'b'},
{name:'C'},
{name:'c'}
];
}]).filter('customOrderBy',函数(){
返回函数(输入,名称)
{
var结果=[]
用于(输入的var项)
{
var prop=项目[名称];
var toUpper=prop.toUpperCase().charCodeAt(0);
push({item,code:toUpper+(prop.toLowerCase()==prop?0:1)});
}
返回结果.sort(函数(a,b){returna.code>b.code?1:(a.code==b.code?0:-1);}).map(函数(x){returnx.item;});
}
})

名称
{{friend.name}

我对代码做了一些更改,请检查并告知我工作正常。谢谢。但我添加了一些字符,优先级发生了变化。。如果我想处理多个字符和单个字符,我应该如何编码?对于多个字符,您应该一个接一个地比较它们,实现逻辑,在我的答案中给出,或者您自己的答案。
<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;
    }
}]);