JavaScript:用乌克兰字母对对象数组进行排序

3

我有一个对象数组:

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': 'Перу'},
]

我做错了什么?

这里是在jsfiddle上的示例和我的jsfiddle结果截图。

enter image description here

谢谢!

编辑:

我发现只有Google Chrome排序不正确:FireFox和Opera正确。

2个回答

3
你的代码对我来说按照预期运行。
这并不会产生实际影响,但是如果某个东西已经是字符串,你就不需要调用.toString()。也就是说,你可以将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的页面没有提到这一点)- 强调我的话: 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进行跟踪。


我也得到了相同(不正确)的结果...我正在使用Chrome控制台,我的计算机系统语言是乌克兰语。也许这就是原因... - Vitalii Ponomar
我已经更新了我的问题,附带了jsfiddle代码和结果截图。 - Vitalii Ponomar
@VitaliPonomar - 请查看我回答底部的更新。如链接的错误报告中所示,这似乎是Google Chrome中已知的问题。 - ziesemer

0

试试这个:

var sorted = countries.sort(function(a, b) { return a.name.localeCompare(b.name) });

我也得到了相同(不正确)的结果...我正在使用Chrome控制台,我的计算机系统语言是乌克兰语。也许这就是原因... - Vitalii Ponomar
1
这个答案有什么作用会影响结果吗? - ziesemer
我已经更新了我的问题,附带了jsfiddle代码和结果截图。 - Vitalii Ponomar
我使用你们国家对象进行了测试,排序是正确的。令人惊讶的是,这在你的系统语言下无法正常工作。 - ron tornambe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接