【问题标题】:AngularJS ng-repeat orderby doesn't work properly with greek wordsAngularJS ng-repeat orderby 不适用于希腊词
【发布时间】:2015-02-08 11:49:37
【问题描述】:

看来,当我在 ng-repeat 中使用 orderBy 过滤器时,为了按某些属性按字母顺序对对象数组进行排序,我得到的结果是错误的。 具体来说,orderBy 首先放置所有以带有重音符号的字母开头的字符串,例如 Ά、Έ、Ή、Ί 等,而忽略它们在字母表中的位置。 在我的示例中,我创建了一个对象数组

$scope.words = [
{id: 1, name: "Αντώνης"},
{id: 2, name: "Ίκαρος"},
{id: 3, name: "Έλλη"},
{id: 4, name: "Βασίλης"},
{id: 5, name: "Γιάννης"},
{id: 6, name: "Δημήτρης"},
{id: 7, name: "Ζήσης"},
{id: 8, name: "Ηρακλής"},
{id: 9, name: "Θανάσης"},
];

并使用 ng-repeat 指令创建列表:

<div ng-repeat="w in words | orderBy:'name'">{{w.name}}</div>

我得到的排序结果是:

Έλλη, Ίκαρος, Αντώνης, Βασίλης, Γιάννης, Δημήτρης, Ζήσης, Ηρακλής, Θανάσης

虽然正确的是:

Αντώνης, Βασίλης, Γιάννης, Δημήτρης, Έλλη, Ζήσης, Ηρακλής, Θανάσης, Ίκαρος

见小提琴here

有没有办法纠正这种行为?如何创建自己的 orderBy 过滤器?

【问题讨论】:

标签: javascript angularjs sorting sql-order-by ng-repeat


【解决方案1】:

我了解您的单词在带重音时排序不正确。

您可以使用地图来删除所有重音,并使用这样的服务:

.factory('diacritics',['diacriticsMap',function(diacriticsMap){//should inject diacriticsMap
var removeDiacritics=function (str) {
        var letters = str.split("");
        var newStr = "";
        for(var i=0; i< letters.length; i++) {
            newStr += letters[i] in diacriticsMap ? diacriticsMap[letters[i]] : letters[i];
        }
        return newStr;
    };
return {
    remove:removeDiacritics
};

其中地图是这样的常量:

constant('diacriticsMap',{ "A":"A", "Ⓐ":"A", "A":"A", "À":"A", ... })

然后您可以对非重音单词进行排序,这肯定会起作用。

【讨论】:

  • 我实际上有一张包含不同字母表的所有字母的地图,但我没有看到将其全部包含在我的答案中的意义。但是,如果您选择此选项,我可以通过其他方式将其发送给您
  • 我使用了类似的方法来解决这个问题。我创建了一个过滤器,用普通字母替换重音字母,以及一个用作 orderBy 函数并利用过滤器的控制器方法。 fiddle
猜你喜欢
  • 1970-01-01
  • 2017-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-31
  • 2014-09-01
  • 1970-01-01
  • 2014-07-18
相关资源
最近更新 更多