Javascript 中基于区域设置的排序,以预定义的方式对重音字母和其他变体进行排序

2024-01-03

在芬兰语中,我们排序W after V(如英语)但是因为W不是芬兰本土字母,它被认为是一个变体V,它被排序为等于V,但在两个词之间唯一的区别是V is W, then V-版本首先排序。一个例子说明了正确的顺序:

Vatanen, Watanen, Virtanen

芬兰语V and W整理为A and Á. Á排序如下A,但如果这是唯一的区别,则非重音符号排在第一位。同样的规则适用于所有其他重音字母,但是Å, Ä and Ö在Z之后单独整理。

问题:以预定义方式对变体进行排序的最佳算法是什么? ( eg. [Watanen, Vatanen, Virtanen] to [Vatanen, Watanen, Virtanen] )?

添加:这个问题与扩展以涵盖其他变体的定义方式相关。http://cldr.unicode.org/index/cldr-spec/collat​​ion-guidelines http://cldr.unicode.org/index/cldr-spec/collation-guidelines,因为该技术很可能是相同的,并且该问题的答案有利于最广泛的受众,并且排序算法可以与 Unicode CLDR 中定义的排序规则兼容。 Unicode CLDR 定义了字母之间的三个差异级别:一级(基本字母)、二级(重音字母)和三级(字符大小写)。

我想到了某种数组准备,例如在数字排序中,我们可以用零填充所有数字以使它们作为字符串进行比较。示例:数组[file1000.jpg, file3.jpg, file22.jpg]可以通过以下方式用零填充来使其与字符串进行比较:[file1000.jpg, file0003.jpg, file0022.jpg]。由于数组的准备,我们可以使用原生 Array.sort() 非常快速地对其进行排序。

目标语言是Javascript,它缺乏对基于排序规则的支持,因此必须自己制作自定义排序功能。该算法是首选,但如果您也有代码,则值得+1。


自从您最初提出这个问题以来,JavaScript 终于获​​得了一些不错的语言环境支持,包括排序规则。

阅读新内容EcmaScript 6 / 和谐 https://en.wikipedia.org/wiki/ECMAScript#ECMAScript_Harmony_.286th_Edition.29特征Intl https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl#toc并且,具体来说,Intl.Collator https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Collator.

该文档实际上并没有非常清楚地表明芬兰语支持现代和传统排序顺序,但我已经尝试过了,而且确实如此。

要获取传统订单的整理器,您需要传递一个“花哨”的语言代码字符串:fi-u-co-trad。对于“改革后”的排序顺序有fi-u-co-reformed。这可以分解为:

  • fi- 芬兰语的 ISO 639 语言代码。
  • u- 启用 Unicode 功能/选项。 (没有详细记录)
  • co- 排序规则选项。
  • trad- 传统的排序顺序。我读到了有关西班牙语的此选项,但通过测试发现它也适用于芬兰语。 (没有详细记录)
  • reformed- 改革排序顺序。似乎是“传统”的反义词。如果您两者都没有指定trad nor reformed你会得到default,这可能是trad在某些浏览器上和reformed在其他人身上。

法典:

var surnames = ['Watanen', 'Vatanen', 'Virtanen'];

var traColl = new Intl.Collator('fi-u-co-trad');
var refColl = new Intl.Collator('fi-u-co-reformed');
var defColl = new Intl.Collator('fi');

console.log('traditional:', traColl.resolved.requestedLocale + ' -> ' + traColl.resolved.collation, surnames.sort(function (a, b) {
  return traColl.compare(a,b);
}));

console.log('reformed:', refColl.resolved.requestedLocale + ' -> ' + refColl.resolved.collation, surnames.sort(function (a, b) {
  return refColl.compare(a,b);
}));

console.log('default:', defColl.resolved.requestedLocale + ' -> ' + defColl.resolved.collation, surnames.sort(function (a, b) {
  return defColl.compare(a,b);
}));

Outputs:

传统: fi-u-co-trad -> trad ["Vatanen", "Watanen", "Virtanen"]
改革: fi-u-co-reformed -> 改革 ["Vatanen", "Virtanen", "Watanen"]
默认值:fi -> 默认值[“Vatanen”,“Virtanen”,“Watanen”]

在 Google Chrome 中进行了测试,根据我在网上阅读的内容,它在这方面落后于 Firefox。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Javascript 中基于区域设置的排序,以预定义的方式对重音字母和其他变体进行排序 的相关文章

  • 使用 Angular 指令禁用文本选择

    我正在学习 JavaScript 和 AngularJS 我想使用 Angular Directive 禁用文本选择 我有该函数的 JavaScript 代码 function clearSelection if document sele
  • 使用 Node.js 构建网站的最佳实践

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 我想知道如何使用 Node js 从头开始 开发一个网站 我明白我怎么能possibly
  • 如何使用 Playwright 使用选择器查找框架 (iframe)

    我有一个小问题 无法找到使用 Microsoft Playwright 框架的答案 根据您可以使用以下代码获取 iframe const frame page frame frame login 但是如何使用选择器来查找 iframe 并与
  • 本地推送通知到在应用程序内运行 JS 代码的 Win8 Live Tile

    我正在尝试将更新发送到我的应用程序的磁贴 当应用程序运行时 这可以正常工作 例如 当用户单击按钮时 我可以轻松地将磁贴更新通知发送到磁贴 我无法解决的是当应用程序无法运行时如何更新磁贴 我找到的唯一选择是使用以下命令从远程 Web 服务器拉
  • 为什么这个算法的Big-O复杂度是O(n^2)?

    我知道这个算法的大O复杂度是O n 2 但我不明白为什么 int sum 0 int i 1 j n n while i lt j sum 即使我们设定了j n n一开始 我们在每次迭代期间递增 i 并递减 j 因此最终的迭代次数不应该比n
  • 如何光栅化旋转矩形(通过 setpixel 在 2d 中)

    我有四个 2d 顶点 A B C D 的旋转矩形 我需要在像素缓冲区中 有效地 光栅化 绘制它 使用 setpixel x y 颜色 怎么做 我正在尝试使用一些代码 例如 convertilg a b c d do up down left
  • ReactTransitionGroup 不适用于 React-redux 连接组件

    我正在开发一个更大的项目 但我创建了这个简短的示例来说明问题 如果我使用Box组件 它的工作原理 它在控制台中输出componentWillEnter and componentWillLeave当我们点击按钮时 如果我使用BoxConta
  • JavaScript 继承;调用和原型

    要在Javascript中实现继承 通常需要执行以下两个步骤 假设我有一个基类 Animal var Animal function name this name name 我现在想从中派生一个子类 Dog 所以我想说 var Dog fu
  • JavaScript 中的 Promise 有什么意义?

    一个承诺是一个 可能现在可用 或将来可用 或永远不可用的值 来源 MDN 假设我有一个想要处理图片的应用程序 图片已加载 例如在算法在后台使用它之后 或某种其他类型的延迟 现在我想检查一下图片是否可以在future 通过使用承诺 而不是回调
  • onclick 事件中未调用函数

    我想在每个 YouTube 链接的末尾添加一些 HTML 以在 litebox 中打开播放器 到目前为止 这是我的代码 document ready function var valid url new RegExp youtube com
  • mongodb 聚合 - 累积字段的不同组值

    如果我有Player表格文件 name String score Int 我有Group文档 其中组代表玩家列表 groupName String players ObjectID 玩家可以属于多个组 我想做一个聚合Player文档 按以下
  • 求先递增后递减列表的最大值和最小值

    我尝试用谷歌搜索这个问题 但没有取得太大成功 我确信这个问题或类似问题有一个技术名称 但我似乎找不到答案 给定一个列表L整数 即严格递增 然后严格递减 找到该列表的最大值和最小值 例如 L可能 1 2 3 4 5 4 3 2 or 2 4
  • 使用 Google 日历源时如何禁用 FullCalendar 中的活动链接?

    我正在使用 FullCalendar 库从 Google 日历加载日历中的事件 不幸的是 事件添加到日历后 它们是可点击的 当您点击该活动时 您会自动重定向到 Google 日历页面以查看该特定活动 或者如果您有足够的访问权限 则可以直接对
  • 如何从浏览器向服务器发送“页面将关闭”消息?

    我想向每个 html 文档添加一个脚本 JavaScript 该脚本向服务器发送两条消息 页面确实打开了 页面将关闭 此消息包含页面打开的时间 打开消息应在文档加载时 或加载完成时 发送 这是简单的部分 The close message
  • 使用 Jade 评估自定义 javascript 方法 (CircularJSON)

    我想通过 Jade 将一个对象解析为客户端 JavaScript 通常这会起作用 script var object JSON parse JSON stringify object but my object is circular ht
  • Rails 3.1+ 的 Jasmine 与 Mocha JavaScript 测试 [已关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我对茉莉花有经验并且非常喜欢它 有谁有 Jasmine 和 Mocha 的经验 特别是 Rails 的经验吗 我想知道是否值得转用 我已经在 J
  • 有没有办法使用 ko.observableArray 作为地图?

    有没有办法使用ko observableArray http knockoutjs com documentation observableArrays html像地图 字典一样 例如 var arr ko observableArray
  • 什么是 WKWebView 中的 WKErrorDomain 错误 4

    fatal error LPWebView encounters an error Error Domain WKErrorDomain Code 4 A JavaScript exception occurred UserInfo 0x7
  • 仅当显式选择行时才关闭 ui-bootstrap typeahead

    我创建了这个jsBin http jsbin com livuqafe 2 edit来证明我遇到的问题 如果您转到此处 请尝试输入 五 并继续 你的自然反应是输入 五 然后按 Tab 如果你想要 五百 你可以向下箭头一次 但是 在这种情况下
  • 测量窗口偏移

    有没有一种方法可以测量 jQuery 中窗口的偏移量 以便我可以比较 固定 元素和相对定位元素的位置 我需要能够知道窗口滚动了多远 以便我可以使用该图来计算固定元素的高度 相对于视口顶部 和相对对象的高度 相对于顶部 之间的差异文件的内容

随机推荐

  • 会话范围的 Spring MVC 控制器上的 @PreDestroy

    Given a RestController像这样 RestController Scope session public class MyController PreDestroy public void onSessionDestroy
  • 如何在c#中绘制圆角矩形

    我正在使用这段代码来制作一个圆角矩形 但它只绘制了矩形的左上角和右上角 更没有完成下部的矩形 如何让它完整 充实 我应该做出哪些改变 public static Bitmap DrawRoundedRectangle Bitmap Imag
  • GO中如何检查切片是否在切片内部?

    我有以下代码 func main l1 string a b c l2 string a c l2 in l1 我可以使用循环和标志来检查这一点 但是有没有一种简单的方法来检查 l2 是否在 l1 内部 就像 python 命令 l2 in
  • Eclipse 调试 Android 不起作用

    大家好 我在调试 Android 应用程序时遇到 Eclipse 问题 我放置的所有断点都不起作用 应用程序不会停止 它们会因为未放置而被跳过 有办法让它们发挥作用吗 我有Win7 JDK 6u23 64位 Eclipse 3 6 64位
  • 计算MLLIB SVM多类概率

    我想知道如何在多类分类问题中使用 Spark MLLIB SVM 计算概率 文档显示没有这样的功能可用 LibSVM https stackoverflow com questions 7802556 regarding probabili
  • sql join 连接3个表

    这个有点奇怪 有人写了一条在我看来不应该工作的sql 但它确实有效 而且还返回了正确的结果 我写了一个简化的例子 但我认为它说明了要点 drop table client drop table transactions drop table
  • 这个 Urikind.relative 到底是什么意思

    我正在做的是 当我选择一行并单击显示按钮时 我将有一个 datagridview 我想显示图像以及我编写以下代码的一些信息 public partial class WpfWindow Window private UCPersons uc
  • Python:如果目录是符号链接,则 getcwd 和 pwd 给出不同的结果

    如果我的工作目录是符号链接 os getcwd and os system pwd 不给出相同的结果 我想用os path abspath 故意获取我的工作目录 或其中的文件 的完整路径 而不是得到与以下结果相同的结果os path rea
  • 通过 Cisco VPN 更新存储库时,Subversion 报告“格式错误的网络数据”

    我正在使用 Cisco VPN 在 Windows 7 Ultimate 64 位上 连接到我的公司网络 当我检查 svn 存储库时 下载一些文件后 2 或 3 秒我不断收到此错误 该问题发生在 TortoiseSVN 1 5 9 和 Sl
  • 在 Visual Studio 中使用命令行参数进行调试

    我正在 Visual Studio 中开发 C 命令行应用程序 需要使用命令行参数对其进行调试 目前我只是使用我需要的参数运行生成的 EXE 文件 像这样program exe file txt 但这样我就无法调试 有没有地方可以指定调试参
  • SQL 选择最大 BY 组

    WEEK STUDENT CLASS TEST SCORE 1 1 A 1 93 1 1 A 2 97 1 1 B 1 72 1 1 B 2 68 1 1 C 1 93 1 1 C 2 51 1 1 H 1 19 1 2 A 1 88 1
  • 根据分组属性添加新列

    我想在 R 中添加一个新列 将我的子组总结为组 这是我的例子 id c 1 2 2 3 4 4 4 5 5 5 6 6 6 subgroup c lightred lightblue darkblue lightred darkred da
  • 检测处理器的数量

    如何检测 net 中物理处理器 核心的数量 System Environment ProcessorCount 返回逻辑处理器的数量 http msdn microsoft com en us library system environm
  • Linux内核中slab内存管理的缓存着色

    我最近读到有关slab系统的缓存着色的内容 但不明白 为什么为不同slab中的对象添加不同偏移量的缓存着色可以提高性能 我最初的猜测是 具有缓存偏移量的slab分配器 尝试将slab的第一个对象放在不同缓存颜色的内存中 如果客户端从这些sl
  • 如何覆盖已经有 !important 的 CSS 背景?

    我试图用时尚覆盖网站的背景 但它不起作用 网站的背景 css 也有一个 important 并且它是压倒性的 我的代码 body background image none important background black import
  • 有没有办法在 grpc 服务器端设置超时?

    无法从服务器端使 grpc 连接超时 客户端可能建立连接但保持保持 睡眠状态 从而导致 grpc 服务器连接挂起 服务器端有没有办法在一定时间后断开连接或设置超时 我们尝试从客户端断开连接 但无法从服务器端执行此操作 在这个链接中gRPC
  • 如何强制命令行使用 PHP 版本?

    我由 1and1 com 托管 并且我已将我的文件设置为使用 php5 进行解析 htaccess 但这仅适用于 apache 而不适用于命令行 命令行默认为服务器默认 php4 所以目前我无法设置计划任务以 php5 运行我的代码 有任何
  • .htaccess - 递归地将斜杠映射到下划线

    G day 正如标题所示 我正在尝试将网址格式设置为 this is mah page strucutre到文件this is mah page structure php 现在 我已经可以工作了 只是我不知道结构的深度 因此我需要进行一些
  • Julia 中 @sync @async 的并行性

    我有一些繁重的 csv 表 我想与 sync sync 宏并行导入 对此不太熟悉 我尝试了以下方法 import files sync async begin df1 CSV File libname df1 csv gt DataFram
  • Javascript 中基于区域设置的排序,以预定义的方式对重音字母和其他变体进行排序

    在芬兰语中 我们排序W after V 如英语 但是因为W不是芬兰本土字母 它被认为是一个变体V 它被排序为等于V 但在两个词之间唯一的区别是V is W then V 版本首先排序 一个例子说明了正确的顺序 Vatanen Watanen