【问题标题】:JavaScript's sort method handling of capital lettersJavaScript 对大写字母的排序方法处理
【发布时间】:2014-02-11 22:47:33
【问题描述】:

注意到 JavaScript 的 sort() 方法可能有些奇怪。给定以下数组:

var arr = ['Aaa',
'CUSTREF',
'Copy a template',
'Copy of Statementsmm',
'Copy1 of Default Email Template',
'Copy11',
'Cust',
'Statements',
'zzzz'];

在这个数组上调用排序:

console.log(arr.sort());

产量:

["Aaa", "CUSTREF", "Copy a template", "Copy of Statementsmm", "Copy1 of Default Email Template", "Copy11", "Cust", "Statements", "zzzz"] 

这是正确的吗? IE。 CUSTREF 排在第一位,是不是因为是大写字母?

【问题讨论】:

标签: javascript


【解决方案1】:

没错。字符串以二进制方式排序,使用字符本身的序数值。

对于不区分大小写的排序,试试这个:

arr.sort(function(a,b) {
    a = a.toLowerCase();
    b = b.toLowerCase();
    if( a == b) return 0;
    return a < b ? -1 : 1;
});

【讨论】:

  • 好的...刚才哪两个笨蛋否决了这个答案,为什么?
【解决方案2】:

你是对的,这是因为大写字母。如果要对可能包含非 ASCII 字符(例如 ä 和 ö)的字符串进行排序,则应使用 String.localeCompare()。这也解决了大写字母问题。

arr.sort(function (a, b) {
    return a.localeCompare(b);
});

【讨论】:

    【解决方案3】:

    是的, 它具有更高的 Unicode 值。 (它 = 第一个单词中的“U”)

    你最好用

    .sort(function(a,b) { return (a.toLowerCase() &lt; b.toLowerCase()) ? -1 : 1;});

    【讨论】:

    • 错误。排序函数必须返回一个数字,而不是布尔值。
    • + 缺少参数 ab
    • @Teemu Pfft,也是。布尔返回对我来说是如此盲目,以至于我完全错过了缺失的参数! XD
    【解决方案4】:

    如果您查看字符的编码方式(例如 ASCII 表),您会看到,大写字母的值低于小写字母,所以是的 - 这是因为大写字母

    【讨论】:

      【解决方案5】:

      由于 U (U+0055) 的 Unicode 值小于 o (U+006F),因此区分大小写的 sort 将始终将 U 放在 o 之前。对于不区分大小写的sort,您应该尝试:

      arr.sort(
          function(a, b){
              if (a.toLowerCase() < b.toLowerCase()) return -1;
              if (a.toLowerCase() > b.toLowerCase()) return 1;
              return 0;
          }
      );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-11-18
        • 1970-01-01
        • 1970-01-01
        • 2020-08-24
        • 2013-02-01
        • 2018-06-14
        • 2012-06-25
        相关资源
        最近更新 更多