AngularJS ng-repeat orderby 不能正确处理希腊词
AngularJS ng-repeat orderby doesn't work properly with greek words
看来,当我在 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>
我得到的排序结果是:
Έλλη, Ίκαρος, Αντώνης, Βασίλης, Γιάννης, Δημήτρης, Ζήσης, Ηρακλής, Θανάσης
而正确的是:
Αντώνης, Βασίλης, Γιάννης, Δημήτρης, Έλλη, Ζήσης, Ηρακλής, Θανάσης, Ίκαρος
参见 fiddle here。
有没有办法纠正这种行为?我如何创建自己的 orderBy 过滤器?
我了解到您的单词在重音时排序不正确。
您可以使用地图删除所有重音符号,并使用像这样的服务:
.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",
...
})
然后您可以对非重音单词进行排序,这绝对有效。
看来,当我在 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>
我得到的排序结果是:
Έλλη, Ίκαρος, Αντώνης, Βασίλης, Γιάννης, Δημήτρης, Ζήσης, Ηρακλής, Θανάσης
而正确的是:
Αντώνης, Βασίλης, Γιάννης, Δημήτρης, Έλλη, Ζήσης, Ηρακλής, Θανάσης, Ίκαρος
参见 fiddle here。
有没有办法纠正这种行为?我如何创建自己的 orderBy 过滤器?
我了解到您的单词在重音时排序不正确。
您可以使用地图删除所有重音符号,并使用像这样的服务:
.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",
...
})
然后您可以对非重音单词进行排序,这绝对有效。