【问题标题】:Deterministic string compare in JS/TS?JS/TS 中的确定性字符串比较?
【发布时间】:2021-08-14 18:06:34
【问题描述】:

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

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

我想出的核心解决方案是散列每个字符串,然后将它们与语言环境选项en 进行比较。有更简单的解决方案吗?

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

【问题讨论】:

    标签: javascript typescript string-comparison


    【解决方案1】:

    奇怪的是,符合您要求的是……默认的sort

    theStrings.sort();
    

    根据字符串中的 UTF-16 代码单元进行排序,这不会因计算机/区域设置/其他内容而异。它将字符串视为(有效地)一系列 16 位数字(准确地说是 Unicode 代码单元)。

    来自the specification

    如果comparefn不是未定义的,它应该是一个接受两个参数xy的函数,如果返回一个负数>x < y,如果 x > y 则为正数,否则为零。

    <>操作符是由规范中的抽​​象IsLessThan操作定义的,通过字符串中的代码单元进行比较。

    【讨论】:

    • 大声笑!我认为这意味着localeCompare。另一方面,我实际上有一个 Map 对象,我需要在其中对键进行排序。表示我使用实际密钥new Map(Array.from(myMap.entries()).sort((a, b) => ???))
    • @HelloWorld - 假设默认排序(以字符串术语定义)将使用localeCompare 是完全合理的(恕我直言)。它没有,但这是一个完全合理的假设。 :-D
    • 谢谢!我认为您的帖子编辑填补了最后一个空白。我可以依靠<>
    【解决方案2】:

    两种解决方案:

    • 使用特定的语言环境,而不是像localeCompare 这样的当前语言环境。 JS 通过Intl.Collator 支持这一点:

      arr.sort(new Intl.Collator('en').compare)
      

      选择您需要的任何语言。

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

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

    【讨论】:

    • 那也很有帮助,谢谢,尤其是后者
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-18
    • 2010-10-25
    • 1970-01-01
    • 2018-02-18
    • 2014-02-17
    • 1970-01-01
    相关资源
    最近更新 更多