强制 localeCompare 区分大小写

问题描述 投票:0回答:2

我正在尝试使用 JavaScript 的 localeCompare 函数对字符串进行排序。

我对在 devTools 控制台中运行以下几行的结果感到惊讶:

"a".localeCompare("b") // returns: -1
"A".localeCompare("b") // returns: -1

另一个测试:

"b".localeCompare("a") // returns: 1
"B".localeCompare("a") // returns: 1

即使我更具体地了解我的类型,我也会得到相同的结果:

"a".localeCompare("b", { usage: "sort", sensitivity: 'variant' }) // -1
"A".localeCompare("b", { usage: "sort", sensitivity: 'variant' }) // -1
"b".localeCompare("a", { usage: "sort", sensitivity: 'variant' }) // 1
"B".localeCompare("a", { usage: "sort", sensitivity: 'variant' }) // 1

我想使用 localeCompare 以区分大小写的方式比较字符串,所以“b”与“a”相比以及“B”与“a”相比不应该有相反的结果吗?

javascript string-comparison
2个回答
19
投票

LocalCompare 可以区分大小写,由

{ sensitivity: 'case'}
或 unicode 扩展名启用:
u-kf-upper
u-kf-lower

LocalCompare 规范说:

结果旨在按排序顺序对字符串值进行排序 由系统默认区域设置指定

或者您可以添加作为参数的区域设置。

区分大小写顺序的 en-US 默认值是 “较低”,其中:

aAbBcC ...

您可以将其更改为“上”,即:

AaBbCc ...

此测试表明,从

upper
切换到
lower
只会影响同一个字母,并且不会将大写字母排在小写之前,反之亦然。

var b = "A".localeCompare("a", 'en-US-u-kf-lower'); //  1
var c = "A".localeCompare("a", 'en-US-u-kf-upper'); // -1
var d = "A".localeCompare("b", 'en-US-u-kf-upper'); // -1
var e = "A".localeCompare("b", 'en-US-u-kf-lower'); // -1

  • 可能有一个区域设置以不同的方式对大写/小写进行排序,但我不知道有什么...
  • 国际排序顺序不区分大小写
  • ASCII 排序顺序为
    ACb
  • 某些语言环境有不同的顺序:例如芬兰语的 V 类似于 W:
    Va Wb Vc
    ...

区分大小写是否会以任何方式影响数值?

var b = "1".localeCompare("a", 'en-US-u-kf-lower'); //  -1
var c = "1".localeCompare("A", 'en-US-u-kf-upper'); // -1
var d = "104".localeCompare("a", 'en-US-u-kf-upper'); // -1

不,但是...

有一个选项,可以比较数值:

kn

使用选项或 Unicode 扩展

kn
可以启用数字比较 (
kn-true
):

var b = "10".localeCompare("2", 'en-US-u-kn-true'); // 1
var c = "10".localeCompare("2", 'en-US'); // -1

但是,数字始终位于字母之前:

var d = "1".localeCompare("a", 'en-US-u-kn-true'); // -1
var e = "1".localeCompare("a", 'en-US'); // -1

0
投票

使用

String.prototype.localeCompare()
进行词典比较并不能按照您在比较具有不同大小写的字符串时所期望的方式(例如
'a'
'A'
)。这是因为 localeCompare 根据语言约定比较字符串,并且默认情况下,它不会优先考虑区分大小写而不是字典顺序。

如果您想对“A”位于“a”之前的字符串进行排序,则只需按原样使用

Array.prototype.sort()
即可。

const strings = ['a', 'A', 'b', 'B'];
strings.sort(();
console.log(strings); // ["A", "B", "a", "b"]

@拉什米 要实现 alpha 位于 Acuityads 之前的排序,您可以将 Array.prototype.sort() 方法与自定义比较函数结合使用。具体方法如下:

const array = [{ name: "Acuityads" }, { name: "alpha" }];

array.sort((a, b) => {
  if (a.name > b.name) return -1;
  else if (a.name === b.name) return 0;
  else return 1;
});
console.log(array); // [{ name: "alpha" }, { name: "Acuityads" }]

此代码以违反自然词典顺序的方式对数组进行排序,其中小写字母优先于大写字母,因此 alpha 位于 Acuityads 之前。

比较功能的工作原理是检查

a.name
是否大于
b.name
。如果是,则返回 -1(表示 a 应该在 b 之后)。如果相等,则返回 0。否则返回 1,表示 a 在 b 之前。

© www.soinside.com 2019 - 2024. All rights reserved.