我有一个对象数组:
var countries = [
{'id': 35, 'name': 'Перу'},
{'id': 45, 'name': 'Індія'},
{'id': 55, 'name': 'Єгипет'},
{'id': 65, 'name': 'Албанія'},
]
我需要按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': 'Перу'},
]
我做错了什么?
以下是example on jsfiddle以及jsfiddle中我的结果的屏幕截图。
谢谢!
修改
我发现只有Google Chrome排序不正确:FireFox和Opera都是正确的。
答案 0 :(得分:3)
您的代码正如您所期望的那样工作。
它不会产生功能差异,但您不需要在已经是String的内容上调用.toString()
。 I.E.,您可以将mySort
简化为:
var mySort = function(s1, s2){
return s1.name.localeCompare(s2.name);
}
(我也更喜欢将所有函数声明为变量,因为它们在JavaScript中都是相同的 - 所以它们应该被一致地处理。)
但是,为了回答为什么这可能不适合你,根据http://msdn.microsoft.com/en-us/library/windows/apps/62b7ahzy%28v=vs.94%29.aspx(有趣的是,MDN's page没有说明这一点) - 强调我的:
localeCompare执行区域设置敏感的字符串比较 stringVar和stringExp并返回-1,0或+1,取决于 系统默认语言环境的排序顺序。
如果你想要一些纯粹根据字符代码排序而不考虑用户的语言环境的东西,你可以改用它:
var mySort = function(s1, s2){
if(s1 == s2){
return 0;
}
return s1.name > s2.name;
}
无论客户端或用户的设置/偏好如何,这都会一致地排序 - 但它也会返回您归类为不正确的结果。
修改:正如您所提到的,您所观察到的行为特定于Google Chrome,这似乎是Chrome中的一个已知问题,正在http://code.google.com/p/v8/issues/detail?id=459跟踪。< / p>
答案 1 :(得分:0)
试试这个:
var sorted = countries.sort(function(a, b) { return a.name.localeCompare(b.name) });