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

标签 javascript sorting

我有一个对象数组:

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

我做错了什么?

这里是 example on jsfiddle以及我在 jsfiddle 中的结果截图。

enter image description here

谢谢!

编辑:

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

最佳答案

您的代码对我来说如您所愿。

它不会产生功能上的差异,但您不需要对已经是字符串的内容调用 .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's page 对此没有任何说明)- 强调我的:

The localeCompare performs a locale-sensitive string comparison of the stringVar and the stringExp and returns -1, 0, or +1, depending on the sort order of the system default locale.

如果您想要只根据字符代码排序而不考虑用户语言环境的东西,您可以改用它:

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 进行跟踪。 .

关于JavaScript:用乌克兰字母对对象数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9047731/

相关文章:

javascript - react 错误: Cannot read property 'users' of undefined

javascript - 单击时使用 jQuery 和 AJAX 更改页面内容

java - 比较具有涉及 boolean 值的多个属性的列表

javascript - 按属性名称 AngularJS 对列表进行排序

c - 使用 C 中的计数出现次数进行 Turbo Sort 排序最多 10^6

javascript - p :inputText and p:selectOneMenu strange interaction on IE 10

javascript - 将 url anchor 从 javascript 变量传递到 php 变量

javascript - 如何在angularjs中设置范围 slider 中的时间?

css - 带有垂直标题的表格(可排序)

Python:修改列表的排序顺序