我有一个要排序的字符数组:
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
呢?