我正在尝试我希望在编码中做一些简单的练习:使用ASCII样式字典顺序排序Javascript字符串(例如,在小写字母之前的大写字母之前的数字......)。
这是一个片段:
var str1 = "ab";
var str2 = "Ab";
var n = str1.localeCompare(
str2, "en", {sensitivity: 'variant', caseFirst: "upper"}
);
在这种情况下,我希望n
为1
,但会返回-1
。
来自this页面上的文档:
sensitivity
的{{1}}值可以区分所有基本字母和重音字母,包括案例variant
的{{1}}值会强制大写字母与小写字母相比较小caseFirst
参数化默认为upper
,无论如何这都是无关紧要的,因为我指的是usage
sort
参数化将默认为variant
我假设选项会覆盖默认的区域设置,但我无法找到有关此问题的任何具体信息。
事实上,如果它默认为ignorePunctuation
并优先于选项,那么我认为案例将被忽略(例如,参见接受的答案here)。
我做错了什么?
备注
答案 0 :(得分:1)
您可以通过查看字母的大小写来使用解决方法,并使用反映上下字母位置的辅助字符串。
排序前的辅助数组
排序后index value ----- ----- 0 a b 1 a B 2 Ab 3 A B
index value ----- ----- 3 A B 2 Ab 1 a B 0 a b
var array = ['ab', 'aB', 'Ab', 'AB'],
mapped = array
.map((el, i) => ({ index: i, value: [...el].map(c => c === c.toUpperCase() ? ' ' + c : c + ' ').join('') }))
.sort((a, b) => a.value.localeCompare(b.value)),
result = mapped.map(el => array[el.index]);
console.log(result);

.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:1)
我不确定你是如何获得-1
的。当我运行您提供的确切代码时,我会得到1
。在使用-1
进行测试时,我只获得str1.localeCompare(str2)
。或许记下this warning:
不需要实现来支持此属性。
如果您的sensitivity
设置为variant
,而caseFirst
设置为upper
,那么这已经是字符串的默认比较。区域设置通常用于同义字符变体。此外,在ASCII和Unicode中,大写已经在小写之前。所以你只需要-(str1 < str2) || +(str1 > str2)
并完全避免函数调用:
var str1 = "ab";
var str2 = "Ab";
var a = str1.localeCompare(
str2, "en", {sensitivity: 'variant', caseFirst: "upper"}
);
var b = -(str1 < str2) || +(str1 > str2);
console.log(a, b);