【发布时间】:2021-08-14 18:06:34
【问题描述】:
我正在寻找一种确定性的方式来对字符串列表进行排序。
当然,对字符串进行排序通常会导致建议使用String.localeCompare。但顺序必须是确定性的,与运行它的计算机无关。
我想出的核心解决方案是散列每个字符串,然后将它们与语言环境选项en 进行比较。有更简单的解决方案吗?
字符串可以是英文、德文、中文、日文……
【问题讨论】:
标签: javascript typescript string-comparison
我正在寻找一种确定性的方式来对字符串列表进行排序。
当然,对字符串进行排序通常会导致建议使用String.localeCompare。但顺序必须是确定性的,与运行它的计算机无关。
我想出的核心解决方案是散列每个字符串,然后将它们与语言环境选项en 进行比较。有更简单的解决方案吗?
字符串可以是英文、德文、中文、日文……
【问题讨论】:
标签: javascript typescript string-comparison
奇怪的是,符合您要求的是……默认的sort:
theStrings.sort();
根据字符串中的 UTF-16 代码单元进行排序,这不会因计算机/区域设置/其他内容而异。它将字符串视为(有效地)一系列 16 位数字(准确地说是 Unicode 代码单元)。
如果comparefn不是未定义的,它应该是一个接受两个参数x和y的函数,如果返回一个负数>x
<y,如果 x>y 则为正数,否则为零。
而<和>操作符是由规范中的抽象IsLessThan操作定义的,通过字符串中的代码单元进行比较。
【讨论】:
localeCompare。另一方面,我实际上有一个 Map 对象,我需要在其中对键进行排序。表示我使用实际密钥new Map(Array.from(myMap.entries()).sort((a, b) => ???))
localeCompare 是完全合理的(恕我直言)。它没有,但这是一个完全合理的假设。 :-D
< 和>
两种解决方案:
使用特定的语言环境,而不是像localeCompare 这样的当前语言环境。 JS 通过Intl.Collator 支持这一点:
arr.sort(new Intl.Collator('en').compare)
选择您需要的任何语言。
使用内置的</> 运算符为字符串提供的standard lexicographic comparison:
arr.sort((a, b) => +(a>b)||-(b>a))
arr.sort()
【讨论】: