我找到了一些自然排序字符串的方法
const rows = ['37-SK', '4-ML', '41-NP', '2-YZ', '21', '26-BF'];
console.log(rows.sort((a, b) => a.localeCompare(b, undefined, { numeric: true, sensitivity: 'base' })));
输出如下:
0: "2-YZ"
1: "4-ML"
2: "21"
3: "26-BF"
4: "37-SK"
5: "41-NP"
length: 6
[[Prototype]]: Array(0)
但是当我用null替换undefined时
console.log(rows.sort((a, b) => a.localeCompare(b, null, { numeric: true, sensitivity: 'base' })));
输出:
Uncaught TypeError: Cannot convert undefined or null to object
at String.localeCompare (<anonymous>)
at natSort.js:2:35
at Array.sort (<anonymous>)
at natSort.js:2:18
为什么?
规范就是这样写的。如果第二个参数(locale字符串)是undefined
,则假定它是系统默认值。如果它不是undefined
,那么它必须是一个具有适当的语言环境信息的字符串,否则是一个错误。
edit—如注释中所述,locale参数也可以是一个已经初始化的locale列表对象。然而,undefined
仍然可以工作,而null
则不能。
String#localeCompare
接受三个参数:
参数名称 | 期望值 |
---|---|
compareString |
比较referenceStr 的字符串 |
locales 和options |
这些参数自定义函数的行为,并让应用程序指定应该使用其格式约定的语言。在忽略locales 和options 参数的实现中,使用的区域设置和返回的字符串形式完全依赖于实现。有关这些参数以及如何使用它们的详细信息,请参阅Intl.Collator()构造函数 |