Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/426.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 固定角度排序_Javascript_Sorting_Angularjs - Fatal编程技术网

Javascript 固定角度排序

Javascript 固定角度排序,javascript,sorting,angularjs,Javascript,Sorting,Angularjs,将“奥兰群岛”排序在“津巴布韦”之后。我想以全球的方式解决这个问题。与创建自定义排序函数并在每个过滤器中指定它不同,我希望以某种方式全局修补默认排序函数。这可能吗 通过首先使用以下函数规范化两个字符串,问题得到了解决: function norm(str) { str = str.toLowerCase(); str = str.replace(/\\s/g, ""); str = str.replace(/[àáâãäå]/g, "a"); str = str.replace(

将“奥兰群岛”排序在“津巴布韦”之后。我想以全球的方式解决这个问题。与创建自定义排序函数并在每个过滤器中指定它不同,我希望以某种方式全局修补默认排序函数。这可能吗

通过首先使用以下函数规范化两个字符串,问题得到了解决:

function norm(str) {
  str = str.toLowerCase();
  str = str.replace(/\\s/g, "");
  str = str.replace(/[àáâãäå]/g, "a");
  str = str.replace(/æ/g, "ae");
  str = str.replace(/ç/g, "c");
  str = str.replace(/[èéêë]/g, "e");
  str = str.replace(/[ìíîï]/g, "i");
  str = str.replace(/ñ/g, "n");
  str = str.replace(/[òóôõö]/g, "o");
  str = str.replace(/œ/g, "oe");
  str = str.replace(/[ùúûü]/g, "u");
  str = str.replace(/[ýÿ]/g, "y");
  str = str.replace(/\\W/g, "");
  return str;
}

我希望有一种方法可以做到这一点,以后再也不用担心了。

根据对这个问题的评论,创建一个自定义过滤器。将orderBy筛选器注入此自定义筛选器,以避免重复orderBy已执行的操作:

angular.module('myApp', []).
filter('betterOrderBy', function(orderByFilter) {
    return function(input, arg1, arg2) {
        var copy_of_input = angular.copy(input)
        for (var i = 0; i < input.length; i++) {
            copy_of_input[i]['orig'] = input[i];
            str = copy_of_input[i][arg1].toLowerCase();
            str = str.replace(/[àáâãäå]/g, "a");
            // ...
            copy_of_input[i][arg1] = str.replace(/\\W/g, "");
        }
        var normalized_sorted = orderByFilter(copy_of_input, arg1, arg2);
        var normalized_sorted_orig = [];
        angular.forEach(normalized_sorted, function(obj, i) {
            normalized_sorted_orig.push(obj.orig)
        })
        return normalized_sorted_orig;
    }
});

.

根据对问题的评论,创建自定义筛选器。将orderBy筛选器注入此自定义筛选器,以避免重复orderBy已执行的操作:

angular.module('myApp', []).
filter('betterOrderBy', function(orderByFilter) {
    return function(input, arg1, arg2) {
        var copy_of_input = angular.copy(input)
        for (var i = 0; i < input.length; i++) {
            copy_of_input[i]['orig'] = input[i];
            str = copy_of_input[i][arg1].toLowerCase();
            str = str.replace(/[àáâãäå]/g, "a");
            // ...
            copy_of_input[i][arg1] = str.replace(/\\W/g, "");
        }
        var normalized_sorted = orderByFilter(copy_of_input, arg1, arg2);
        var normalized_sorted_orig = [];
        angular.forEach(normalized_sorted, function(obj, i) {
            normalized_sorted_orig.push(obj.orig)
        })
        return normalized_sorted_orig;
    }
});

.

您可以自己对其进行规范化:

var normalize = function(str) {
  return str.toLowerCase().
             replace(/[àáâãäå]/g, "a");
             // ...
};

app.controller('MainCtrl', function($scope) {
  $scope.items = [
    {name: 'Åland Islands'},
    // ...
  ];

  $scope.normalizedName = function(item) {
    return normalize(item.name);
  };
});
然后在html中使用:

<li ng-repeat="item in items | orderBy:normalizedName">{{item.name}}</li>
  • {{{item.name}

  • 下面是整个示例。

    您可以自己对其进行规范化:

    var normalize = function(str) {
      return str.toLowerCase().
                 replace(/[àáâãäå]/g, "a");
                 // ...
    };
    
    app.controller('MainCtrl', function($scope) {
      $scope.items = [
        {name: 'Åland Islands'},
        // ...
      ];
    
      $scope.normalizedName = function(item) {
        return normalize(item.name);
      };
    });
    
    然后在html中使用:

    <li ng-repeat="item in items | orderBy:normalizedName">{{item.name}}</li>
    
  • {{{item.name}

  • 下面是整个示例。

    创建一个,比如说“betterOrderBy”,可以接受吗?我相信angularjs使用javascript本地比较运算符。@MarkRajcok,这是个好主意。只要除了这个比较修复之外,
    betterOrderBy
    的行为与
    orderBy
    相同,听起来就很完美了。创建一个,比如说“betterOrderBy”,可以接受吗?我相信angularjs使用javascript本机比较运算符。@MarkRajcok,这是个好主意。只要除此比较修复之外,
    betterOrderBy
    的行为与
    orderBy
    的行为相同,听起来就完美了。在“orderBy”中更改数组的内容?感觉可能会有意想不到的一面effects@Liviu,说得好。我更改了代码,先创建一个副本,然后使用副本。谢谢你的回答,@MarkRajcok。看起来这个过滤器不仅为了排序,而且在输出中以小写结束。@Christopher,是的,出于某种原因,我忽略了输出文本应该与原始文本相同的事实。我修改了我的过滤器。它现在应该做你想做的。我更新了答案的示例代码和小提琴。@MarkRajcok我喜欢这个解决方案!您知道如何对过滤器执行相同的操作吗?我尝试了,但没有成功…在“orderBy”中更改数组的内容?感觉可能会有意想不到的一面effects@Liviu,说得好。我更改了代码,先创建一个副本,然后使用副本。谢谢你的回答,@MarkRajcok。看起来这个过滤器不仅为了排序,而且在输出中以小写结束。@Christopher,是的,出于某种原因,我忽略了输出文本应该与原始文本相同的事实。我修改了我的过滤器。它现在应该做你想做的。我更新了答案的示例代码和小提琴。@MarkRajcok我喜欢这个解决方案!您知道如何对过滤器执行相同的操作吗?我试过了,但没有成功…Vojta,这使得影响排序顺序变得非常容易,我真的不需要以全局的方式来做。Vojta,这使得影响排序顺序变得非常容易,我真的不需要以全局的方式来做。