locale与ASCII样式词典排序比较

时间:2018-03-13 14:08:04

标签: javascript string sorting

我正在尝试我希望在编码中做一些简单的练习:使用ASCII样式字典顺序排序Javascript字符串(例如,在小写字母之前的大写字母之前的数字......)。

这是一个片段:

var str1 = "ab";
var str2 = "Ab";
var n = str1.localeCompare(
    str2, "en", {sensitivity: 'variant', caseFirst: "upper"}
);

在这种情况下,我希望n1,但会返回-1

来自this页面上的文档:

  • 设置为sensitivity的{​​{1}}值可以区分所有基本字母和重音字母,包括案例
  • 设置为variant的{​​{1}}值会强制大写字母与小写字母相比较小
  • 缺少caseFirst参数化默认为upper,无论如何这都是无关紧要的,因为我指的是usage
  • 缺少sort参数化将默认为variant

我假设选项会覆盖默认的区域设置,但我无法找到有关此问题的任何具体信息。 事实上,如果它默认为ignorePunctuation并优先于选项,那么我认为案例将被忽略(例如,参见接受的答案here)。

我做错了什么?

备注

  • 我提及" ASCII"这里的唯一目的是识别不忽略大小写的排序顺序,并在适用的小写字母之前对大写字母进行排序。我最终也会将它用于unicode字符串。
  • 正如一些人所建议的,这很可能取决于引擎。 使用Firefox ESR 52.6.0和Chromium 64.0.3282.167进行复制。

2 个答案:

答案 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);