gpt4 book ai didi

javascript - 在 Javascript 中基于语言环境的排序,以预定义的方式对重音字母和其他变体进行排序

转载 作者:可可西里 更新时间:2023-11-01 01:40:54 25 4
gpt4 key购买 nike

在芬兰语中,我们将 W 排在 V 之后(与英语一样),但是因为 W 不是芬兰语的母语字母,所以它被认为是V 的变体,它被排序为等于 V,但在两个词之间唯一的区别是 VW,则V-版本先排序。一个例子阐明了正确的顺序:

Vatanen, Watanen, Virtanen

在芬兰语中,VW 整理为AÁÁ 的排序方式与 A 类似,但在唯一不同的情况下,未重音的排在第一位。同样的规则适用于所有其他重音字母,但 ÅÄÖ 在 Z 之后单独整理。

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

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

我想到了某种数组准备,比如在数字排序中,我们可以用零填充所有数字,使它们可以与字符串进行比较。一个示例:数组 [file1000.jpg, file3.jpg, file22.jpg] 可以准备通过用零填充来使其与字符串具有可比性: [文件 1000.jpg、文件 0003.jpg、文件 0022.jpg]。由于数组的准备,我们可以使用原生 Array.sort() 非常快速地对其进行排序。

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

最佳答案

自从您最初提出这个问题以来,JavaScript 终于获​​得了一些体面的语言环境支持,包括整理。

阅读新的 EcmaScript 6 / Harmony功能 Intl并且,具体来说,Intl.Collator .

文档实际上并没有明确说明芬兰语支持现代排序顺序和传统排序顺序,但我已经尝试过了,它们是支持的。

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

  • fi - 芬兰语的 ISO 639 语言代码。
  • u - 启用 Unicode 功能/选项。 (没有很好的记录)
  • co - 排序规则选项。
  • trad - 传统排序顺序。我阅读了有关西类牙语的此选项,并且仅通过测试发现它也适用于芬兰语。 (没有很好的记录)
  • 改革 - 改革排序顺序。似乎是“传统”的反义词。如果您既不指定 trad 也不指定 reformed,您将得到 default,在某些浏览器上可能是 trad对其他人进行改革

代码:

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);
}));

输出:

traditional: fi-u-co-trad -> trad ["Vatanen", "Watanen", "Virtanen"]
reformed: fi-u-co-reformed -> reformed ["Vatanen", "Virtanen", "Watanen"]
default: fi -> default ["Vatanen", "Virtanen", "Watanen"]

在 Google Chrome 中测试过,根据我在网上看到的,它在这方面落后于 Firefox。

关于javascript - 在 Javascript 中基于语言环境的排序,以预定义的方式对重音字母和其他变体进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12624532/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com