【问题标题】:JavaScript: sort array of objects with Ukrainian lettersJavaScript:用乌克兰字母对对象数组进行排序
【发布时间】:2012-02-21 07:03:56
【问题描述】:

我有一个对象数组:

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 正确。

【问题讨论】:

    标签: javascript sorting


    【解决方案1】:

    您的代码按照您对我的预期运行。

    它在功能上没有区别,但您不需要在已经是字符串的东西上调用.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 对此没有说任何话)-强调我的:

    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 控制台,我的计算机系统语言是乌克兰语。也许这就是原因……
    • 我已经用 jsfiddle 代码和生成的屏幕截图更新了我的问题
    • @VitaliPonomar - 请参阅我答案底部的更新。如链接的错误报告中所示,这似乎是 Google Chrome 中的一个已知问题。
    【解决方案2】:

    试试这个:

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

    【讨论】:

    • 对我来说结果相同(不正确)...我使用的是 chrome 控制台,我的计算机系统语言是乌克兰语。也许这就是原因……
    • 这个答案对结果有什么影响?
    • 我已经用 jsfiddle 代码和生成的屏幕截图更新了我的问题
    • 我使用您的国家对象对此进行了测试,并且排序正确。令人惊讶的是,这不适用于您的系统语言。
    猜你喜欢
    • 2023-03-26
    • 2019-06-15
    • 2018-12-03
    • 2014-09-25
    • 2014-12-30
    • 2020-08-24
    • 2022-06-17
    • 2013-11-02
    相关资源
    最近更新 更多