gpt4 book ai didi

javascript - String.prototype.localeCompare 处理大小写不一致?

转载 作者:可可西里 更新时间:2023-11-01 02:47:50 38 4
gpt4 key购买 nike

请参阅以下最小示例。所有示例都在 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' 决定了它们的顺序('b''B' 之前,如示例 2. 所示)。

为什么 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);

关于javascript - String.prototype.localeCompare 处理大小写不一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57671159/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com