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 中基于区域设置的排序,以预定义的方式对重音字母和其他变体进行排序 的相关文章

  • 非 DOM 对象上的 jQuery 自定义事件

    我最近阅读了一些代码 其功能如下 bob name Bob Smith rank 7 bob bind nameChanged function bob trigger nameChanged 这似乎有效 但我在 jQuery 文档或源代码
  • jQuery 选择 # id 以单词为前缀,计数器为后缀

    有没有办法用 jQuery 选择所有带有前缀 my 和后缀 0 9 的 id 像这样的 my 1 4 还是可以用循环来实现 div div div div div div div div div div 第一个想法 似乎效果很好 div i
  • 动画进度元素值

    我有一个progress元素 该元素如下所示 div class container div div div
  • 从零开始的 numpy 形状意味着什么

    好的 我发现数组的形状中可以包含 0 对于将 0 作为唯一维度的情况 这对我来说是有意义的 它是一个空数组 np zeros 0 但如果你有这样的情况 np zeros 0 100 让我很困惑 为什么这么定义呢 据我所知 这只是表达空数组的
  • 如何使用canvas.toDataURL()将画布保存为图像?

    我目前正在构建一个 HTML5 Web 应用程序 Phonegap 本机应用程序 我似乎不知道如何将画布保存为图像canvas toDataURL 有人可以帮我吗 这是代码 有什么问题吗 我的画布被命名为 canvasSignature J
  • jquery window.open 在 ajax 成功中被阻止

    尝试在我的 ajax 成功调用中打开一个新的浏览器窗口 但是 它被阻止为弹出窗口 我做了一些搜索 发现用户事件需要绑定到 window open 才能避免这种情况发生 我还找到了这个解决方案 您可以在 ajax 之前打开一个空白窗口 然后在
  • Node.js - console.log 不显示数组中的项目,而是显示 [Object]

    我在注销对象内数组的内容时遇到问题 实际的物体看起来像这样 var stuff accepted item1 item2 rejected response Foo envelope from The sender to new item1
  • 按范围迭代数组

    我有一个数组 1 2 3 4 5 6 100 我希望将此数组迭代 5 次 具体来说 取数组的前 5 个数字并获取平均值 继续处理接下来的 5 个数字并获取平均值 依此类推 我尝试过多种方法 例如Dequeue和 for 循环但未能获得所需的
  • JavaScript 中数组的 HTML 数据列表值

    我有一个简单的程序 它必须从服务器上的文本文件中获取值 然后将数据列表填充为输入文本字段中的选择 为此 我想要采取的第一步是我想知道如何动态地将 JavaScript 数组用作数据列表选项 我的代码是
  • 如果链接包含特定文本,jQuery 将类添加到 href

    我的网站上的列表中有一些动态填充的链接 这些链接链接到文件 是否可以使用 jQuery 查看文件名是否以 pdf 结尾 并在 href 或类似的链接文本以 mp3 结尾时添加一个类 例如 我的列表中有以下链接 文件1 pdf 歌曲1 mp3
  • Javascript - 将值从下拉框传递到 Google Maps API

    我正在使用 Google 地图 API 为一家出租车公司创建报价表 目前 用户在 2 个文本框中输入出发点和接载点 API 会计算两点之间的距离以及行程费用 我正在尝试添加两个具有设定位置的下拉框 以便用户可以选择这些位置之一或使用文本框输
  • 是否有任何非轮询方式来检测 DOM 元素的大小或位置何时发生变化?

    很长一段时间以来 我一直在寻找一种方法来检测 DOM 元素的大小或位置何时发生变化 这可能是因为窗口调整了大小 或者因为向该元素添加了新的子元素 或者因为在该元素周围添加了新元素 或者因为 CSS 规则已更改 或者因为用户更改了浏览器的字体
  • 如何在 Angular 中从父组件访问子组件?

    I have mat paginator在子组件a中 如下所示 子组件 html
  • 将名称字符串编码为唯一的数字

    我有一大堆名字 数以百万计 他们每个人都有一个名字 一个可选的中间名和一个姓氏 我需要将这些名称编码为唯一代表这些名称的数字 编码应该是一对一的 即一个名称只能与一个数字相关联 一个数字只能与一个名称相关联 对此进行编码的明智方法是什么 我
  • Select2 下拉列表动态添加、删除和刷新项目

    这让我发疯 为什么 Select2 不能在其页面上实现清晰的方法或示例如何在 Select2 上进行简单的 CRUD 操作 我有一个 select2 从 ajax 调用获取数据
  • 如果数字小于 10,则显示前导零 [重复]

    这个问题在这里已经有答案了 可能的重复 JavaScript 相当于 printf string format https stackoverflow com questions 610406 javascript equivalent t
  • JavaScript onresize 事件多次触发

    我在尝试仅在触发 onresize 事件时运行一次函数时遇到一些麻烦 我已经看过这个问题DOM onresize 事件 https stackoverflow com questions 1500312 javascript onresiz
  • 结构体指针的动态数组

    我必须使用以下代码块来完成学校作业 严格不进行任何修改 typedef struct char firstName char lastName int id float mark pStudentRecord pStudentRecord
  • 防止文本区域出现新行

    我正在开发聊天功能 使用 Vue 并使用文本区域作为输入 以便溢出换行 并且对于编写较长消息的用户来说更具可读性 不幸的是 当用户按下 Enter 键并提交时 光标会在提交之前移动到新行 从而使用户体验感觉不佳 关于如何使用普通 Javas
  • 应用对数来导航树

    我曾经知道一种使用对数从树的一片叶子移动到树的下一个 有序 叶子的方法 我认为它涉及获取 当前 叶子的位置值 排名 并将其用作从根向下到新目标叶子的新遍历的种子 一直使用对数函数测试来确定是否沿着右或左节点向下到达叶子 我已经不记得如何运用

随机推荐

  • 会话范围的 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