请参阅以下最小示例。所有示例均在Chrome 76.0.3809.100,Firefox 68.0.2和Node.js 11.15.0中进行了测试。所有结果都相同。
为了完整起见,提供了所有相关选项(但是它们并未真正计数:默认sensitivity
是'variant'
,对于未重音字符,其工作方式与'case'
几乎相同,但使用默认的'sort'
用法)。
没有设置能够解决下面详述的矛盾。 我也尝试了几种语言选项,但无济于事。
示例1.
以下是正确的:'a'
在'b'
之前。
const result = 'a'.localeCompare('b', 'en', {
sensitivity: 'case',
usage: 'sort',
caseFirst: 'lower'
});
// -1
示例2.
以下是正确的:设置了
caseFirst: 'lower'
,'b'
在'B'
之前。const result = 'b'.localeCompare('B', 'en', {
sensitivity: 'case',
usage: 'sort',
caseFirst: 'lower'
});
// -1
示例3.
以下也是正确的。实现不需要
caseFirst
选项,但实际上支持。设置caseFirst: 'upper'
后,'b'
在'B'
之后。const result = 'b'.localeCompare('B', 'en', {
sensitivity: 'case',
usage: 'sort',
caseFirst: 'upper'
});
// 1
示例4.
以下也是正确的。由于
'b'
在'B'
之前,所以'b{anything}'
在'B{anything}'
之前:const result = 'ba'.localeCompare('Ba', 'en', {
sensitivity: 'case',
usage: 'sort',
caseFirst: 'lower'
});
// -1
示例5.
以下
1
结果是我认为不正确的,因为它与'b{anything}'
出现在'B{anything}'
语句之前相反:const result = 'bb'.localeCompare('Ba', 'en', {
sensitivity: 'case',
usage: 'sort',
caseFirst: 'lower'
});
// 1
据此,
'bb'
在'Ba'
之后。设置sensitivity: 'base'
(不区分大小写)或caseFirst: 'upper'
(使用这些设置产生相同的1
输出-正确,我尝试过)将是有意义的。但是使用此设置,我希望得到
-1
结果:'bb'
在'Ba'
之前,因为按字母顺序,它们的首字母,'b'
和'B'
确定了它们的顺序(如示例2所示,'b'
在'B'
之前)。为什么
localeCompare
表现得如此? 最佳答案
实际上,它不是那样工作的,因为它将所有字母的位置而不是字符串与其字母的位置进行比较。
您可以解决一个问题,并将每个字母与另一个字符串中的一个进行比较(也许这也需要处理最小长度的字母)。
var array = ['a', 'b', 'bb', 'Bb', 'ba', 'BA', 'B', 'bA'];
array.sort();
console.log(...array);
array.sort((a, b) => a.localeCompare(b, 'kf', { sensitivity: 'case', caseFirst: 'lower' }));
console.log(...array);
array.sort((a, b) => {
var r;
Array.from(a).some((c, i) => r = c.localeCompare(b[i], 'kf', { sensitivity: 'case', caseFirst: 'lower' }));
return r;
});
console.log(...array);