如何使localeCompare的行为类似于.sort(),以便所有大写字母都在首位?

时间:2019-03-04 01:38:37

标签: javascript sorting

我有一个要排序的字符数组:

const arr = ['z', 'a', 'Z', 'A'];

我希望排序顺序为:大写字母按字母顺序排列,随后是小写字母按字母顺序排列:

['A', 'Z', 'a', 'z']

在没有任何参数的情况下使用.sort()可以做到这一点很简单:

const arr = ['z', 'a', 'Z', 'A'];
arr.sort();
console.log(arr);

但是如何使用localeCompare确定每个字符的相同相对位置? caseFirst选项看起来很有希望:

  

大写或小写应首先排序。可能的值为“ upper”,“ lower”或“ false”(使用语言环境的默认值);默认值为“ false”。可以通过options属性或Unicode扩展键设置此选项。如果两者都提供,则options属性具有优先权。

但是它似乎没有满足我的要求。我尝试了许多变体:

// Desired result: ['A', 'Z', 'a', 'z']

const arr = ['z', 'a', 'Z', 'A'];
arr.sort((a, b) => a.localeCompare(b));
console.log(arr);
arr.sort((a, b) => a.localeCompare(b, undefined, { caseFirst: 'upper' }));
console.log(arr);
arr.sort((a, b) => a.localeCompare(b, undefined, { sensitivity: 'case', caseFirst: 'upper' }));
console.log(arr);
arr.sort((a, b) => a.localeCompare(b, 'en', { caseFirst: 'upper' }));
console.log(arr);
arr.sort((a, b) => a.localeCompare(b, 'kf', { caseFirst: 'upper' }));
console.log(arr);

我希望它的表现类似于.sort()(至少对于字母字符而言),它比较每个字符的代码点:

['A', 'Z', 'a', 'z'].forEach((char) => {
  console.log(char.charCodeAt());
});

当然,我知道我可以简单地避免使用localeCompare并使用.sort()而不使用回调,或者使用上面的charCodeAt方法:

const arr = ['z', 'a', 'Z', 'A'];
arr.sort((a, b) => a.charCodeAt() - b.charCodeAt());
console.log(arr);

但是我该如何使用localeCompare呢?

0 个答案:

没有答案