Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript:使用乌克兰字母对对象数组进行排序_Javascript_Sorting - Fatal编程技术网

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报告所示。