JavaScript:使用乌克兰字母对对象数组进行排序
我有一个对象数组:JavaScript:使用乌克兰字母对对象数组进行排序,javascript,sorting,Javascript,Sorting,我有一个对象数组: var countries = [ {'id': 35, 'name': 'Перу'}, {'id': 45, 'name': 'Індія'}, {'id': 55, 'name': 'Єгипет'}, {'id': 65, 'name': 'Албанія'}, ] 我需要按名称对其进行排序。这是我的算法: function mySort(s1, s2) { return s1.name.toString().localeCo
var countries = [
{'id': 35, 'name': 'Перу'},
{'id': 45, 'name': 'Індія'},
{'id': 55, 'name': 'Єгипет'},
{'id': 65, 'name': 'Албанія'},
]
我需要按名称对其进行排序。这是我的算法:
function mySort(s1, s2) {
return s1.name.toString().localeCompare(s2.name.toString());
}
var sorted = countries.sort(mySort);
// result (incorrect)
sorted = [
{'id': 55, 'name': 'Єгипет'},
{'id': 45, 'name': 'Індія'},
{'id': 65, 'name': 'Албанія'},
{'id': 35, 'name': 'Перу'},
]
// must be
sorted = [
{'id': 65, 'name': 'Албанія'},
{'id': 55, 'name': 'Єгипет'},
{'id': 45, 'name': 'Індія'},
{'id': 35, 'name': 'Перу'},
]
我做错了什么
下面是我在JSFIDLE中的结果的屏幕截图
谢谢
编辑:
我发现只有Google chrome排序不正确:FireFox和Opera做得正确。您的代码正按照您对我的期望工作
它在功能上没有什么区别,但是您不需要对已经是字符串的东西调用.toString()
。也就是说,您可以将mySort
简化为:
var mySort = function(s1, s2){
return s1.name.localeCompare(s2.name);
}
(我也更喜欢将所有函数声明为变量,因为它们在JavaScript中都是相同的,所以应该一致地处理它们。)
然而,为了回答为什么这可能不适合你,佩尔(有趣的是,他没有说任何关于这一点的话)-强调我的:
localeCompare对
stringVar和stringExp并返回-1、0或+1,,具体取决于
系统默认区域设置的排序顺序
如果您想要完全根据字符代码进行排序,而不考虑用户的区域设置,则可以使用以下选项:
var mySort = function(s1, s2){
if(s1 == s2){
return 0;
}
return s1.name > s2.name;
}
无论客户机或用户的设置/首选项如何,这都将一致地进行排序,但它也会返回您分类为不正确的结果
编辑:正如您所提到的,您所观察到的行为是特定于Google Chrome的,这似乎是Chrome中的一个已知问题,正在进行跟踪。尝试以下方法:
var sorted = countries.sort(function(a, b) { return a.name.localeCompare(b.name) });
对我来说同样(不正确)的结果。。。我使用的是chrome控制台,我的电脑系统语言是乌克兰语。也许这就是原因……这个答案会以任何方式影响结果吗?我已经用JSFIDLE代码更新了我的问题,并生成了截图。我使用you countries对象对其进行了测试,结果排序正确。令人惊讶的是,这不适用于您的系统语言。相同(不正确)的结果对我来说。。。我使用的是chrome控制台,我的电脑系统语言是乌克兰语。也许这就是原因……我已经用JSFIDLE代码更新了我的问题,并得到了结果screenshot@VitaliPonomar-请查看我答案底部的更新。这似乎是Google Chrome中的一个已知问题,如链接的bug报告所示。