JS/TS 中的确定性字符串比较?

Deterministic string compare in JS/TS?

我正在寻找一种对字符串列表进行排序的确定性方法。

当然,对字符串进行排序通常会导致使用 String.localeCompare 的建议。但是顺序必须是确定的,与运行所在的计算机无关。

我想出的核心解决方案是对每个字符串进行哈希处理,然后将它们与区域设置选项 en 进行比较。有更简单的解决方案吗?

字符串可以是英文、德文、中文、日文...

奇怪的是,符合您要求的是...默认值 sort:

theStrings.sort();

根据字符串中的 UTF-16 代码单元排序,不会因 computer/locale/whatever 而异。它将字符串视为(有效地)一系列 16 位数字(准确地说是 Unicode 代码单元)。

来自the specification

If comparefn is not undefined, it should be a function that accepts two arguments x and y and returns a negative Number if x < y, a positive Number if x > y, or a zero otherwise.

<>运算符由规范中的抽​​象IsLessThan运算符定义,按字符串中的代码单元进行比较。

两种解决方案:

  • 使用特定的语言环境,而不是像 localeCompare. JS supports this through the Intl.Collator:

    这样的当前语言环境
    arr.sort(new Intl.Collator('en').compare)
    

    选择您需要的任何语言。

  • 使用内置 </> 字符串运算符提供的

    arr.sort((a, b) => +(a>b)||-(b>a))
    arr.sort()