JavaScript Array sort()无法正确对字符串数组进行排序

时间:2019-01-18 07:38:19

标签: javascript arrays sorting

我有以下JavaScript代码:

   const ary = ["Kevin", "brandy", "Andrew"];
   const nary = ary.sort();
   console.log(nary);

我希望上述代码的输出为["Andrew","brandy", "Kevin"],即根据单词的字典顺序。

但是在控制台中,我得到了输出:

    ["Andrew","Kevin","brandy"]

当我将b中的"brandy"切换为大写B并再次运行代码时,

     const ary = ["Kevin", "Brandy", "Andrew"];
     const nary = ary.sort();
     console.log(nary);

输出符合预期:

["Andrew","Brandy","Kevin"]

即根据单词的字典顺序。

这意味着对首字母大写的单词给予排序优先,然后对首字母小写的单词进行排序。

我的问题是:

  1. 为什么在JavaScript中会发生这种情况?

  2. 如何使用["Kevin", "brandy", "Andrew"]函数根据单词的字典顺序对字符串数组sort()进行排序?

Input code:

   const ary = ["Kevin", "brandy", "Andrew"];
   const nary = ary.sort();
   console.log(nary);   

Console Output: 
   ["Andrew","Kevin","brandy"]

I want the Output as:

   ["Andrew","brandy", "Kevin"]

3 个答案:

答案 0 :(得分:4)

这是因为,当没有提供回调函数时,元素将转换为UTF-16代码单元后进行排序。对于您而言,这可能是Kelvin的utf转换字符串在brandy之前的原因,因此它按该顺序排序。

使用localeCompare

const ary = ["Kevin", "brandy", "Andrew"];
const nary = ary.sort(function(a, b) {
  return a.localeCompare(b)

});
console.log(nary);

答案 1 :(得分:0)

只需先将键转换为lowerCase,以使键变得不区分大小写。发生这种情况的原因是因为Javascript比较的方式,即['a'<'A'],您可以使用Local compare。根据浏览器设置进行比较。

let arr = ["Andrew","brandy", "Kevin"];
let sorted = arr.sort((a,b) => {
 a.toLowerCase() > b.toLowerCase();
})
console.log(sorted);

答案 2 :(得分:0)

一个衬里答案是localeCompare()

const ary = ["Kevin", "brandy", "Andrew"];
ary.sort(function (a, b) {
    return a.toLowerCase().localeCompare(b.toLowerCase());
});
console.log(ary);