请参阅以下最小示例。所有示例均在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);

10-02 19:59