Javascript String.prototype.localeCompare处理套管不一致?
请参见以下示例。所有示例都在Chrome 76.0.3809.100、Firefox 68.0.2和Node.js 11.15.0中进行了测试。所有这些都产生了相同的结果 为了完整性起见,提供了所有相关选项(但是它们并不真正起作用:默认的Javascript String.prototype.localeCompare处理套管不一致?,javascript,string,sorting,Javascript,String,Sorting,请参见以下示例。所有示例都在Chrome 76.0.3809.100、Firefox 68.0.2和Node.js 11.15.0中进行了测试。所有这些都产生了相同的结果 为了完整性起见,提供了所有相关选项(但是它们并不真正起作用:默认的敏感度是'variant',其工作方式实际上与'case'对于非注释字符,使用默认的'sort'用法相同) 没有任何设置能够解决下面详述的矛盾。我还尝试了几种语言选项,但没有成功 示例1。 以下是正确的:'a'位于'b'之前 const result='a'.l
敏感度
是'variant'
,其工作方式实际上与'case'
对于非注释字符,使用默认的'sort'
用法相同)
没有任何设置能够解决下面详述的矛盾。我还尝试了几种语言选项,但没有成功
示例1。
以下是正确的:'a'
位于'b'
之前
const result='a'.localeCompare('b','en','{
敏感度:“案例”,
用法:'sort',
案例一:“较低”
});
// -1
示例2。
以下是正确的:对于caseFirst:“lower”
set,'b'
位于'b'
之前
const result='b'.localeCompare('b','en','{
敏感度:“案例”,
用法:'sort',
案例一:“较低”
});
// -1
示例3。
以下也是正确的。实现不需要支持caseFirst
选项,但它确实需要。如果设置了caseFirst:'upper'
,则'b'
位于'b'
之后
const result='b'.localeCompare('b','en','{
敏感度:“案例”,
用法:'sort',
案例一:“上”
});
// 1
示例4.
以下也是正确的。由于'b'
在'b'
之前,因此'b{anything}
在'b{anything}'之前:
const result='ba'.localeCompare('ba','en','{
敏感度:“案例”,
用法:'sort',
案例一:“较低”
});
// -1
示例5.
以下1
结果不正确我认为,因为它与'b{anything}'
前面的'b{anything}'语句相矛盾:
const result='bb'.localeCompare('Ba','en','{
敏感度:“案例”,
用法:'sort',
案例一:“较低”
});
// 1
据此,'bb'
位于'Ba'
之后。设置敏感度:'base'
(不敏感地比较大小写)或caseFirst:'upper'
(它们使用这些设置生成相同的1
输出-正确-,我尝试过)
但是有了这个设置,我希望有一个-1
结果:'bb'
在'Ba'
之前,按字母顺序排列,'b'
和'b'
确定它们的顺序(并且'b'
在'b'
之前,如例2所示)
为什么localeCompare
的行为是这样的?它实际上不是这样工作的,因为它将所有的字母位置(而不是字符串)与字母的位置进行比较
您可以将每个字母和另一个字符串进行比较(可能这也需要处理最小长度的字母)
var数组=['a','b','bb','bb','ba','ba','b','ba'];
array.sort();
log(…数组);
sort((a,b)=>a.localeCompare(b,'kf',{sensitivity:'case',caseFirst:'lower'});
log(…数组);
array.sort((a,b)=>{
var-r;
一些((c,i)=>r=c.localeCompare(b[i],'kf',{sensitivity:'case',caseFirst:'lower'}));
返回r;
});
log(…数组)代码>感谢您的回答和解决方法。您能否更准确地描述一下,localeCompare
发生了什么,以及为什么?我真的没听懂。