使用 JavaScript 按字母顺序对丹麦语进行排序?

dan*_*ani 3 javascript sorting locale

是否有库或跨浏览器本机实现来在 JavaScript 中按字母顺序对丹麦字符串数组进行排序?

[奥尔堡,索罗...]

Tib*_*bos 7

您可以使用以下方法对Chrome和IE11中任何语言的字符串进行排序:

\n\n
var arr = [\'Aalborg\', \'Sor\xc3\xb8\']; // array to sort\nvar myLocale = \'da-DK\'; // danish locale\n\nvar sortedArr = arr.sort(function(a,b) { return a.localeCompare(b, myLocale); }); // sort\n\nconsole.log(sortedArr);\n
Run Code Online (Sandbox Code Playgroud)\n\n

对于与浏览器无关的解决方案,您有两种选择:

\n\n
    \n
  1. 填充 localeCompare 函数(或将其替换为仅适用于丹麦语的函数)
  2. \n
  3. 改变整个排序算法
  4. \n
\n\n

对于此任务,我将使用类似桶排序的算法,理论上该算法应该比默认排序运行得更快(它将进行最少的比较)。

\n\n

总体思路是遍历每个字符串,根据第一个字母将它们放入(排序的)桶中。您继续根据第二个字母拆分每个包含至少 2 个字符串的桶,然后是第三个字母,依此类推。最后,合并存储桶并得到排序后的数组。

\n


dav*_*rad 6

不幸的是@Tibos 解决方案不起作用。丹麦字母æøå不像丹麦人所期望的那样可排序。并且它肯定不会与aa被认为是老派的一起使用å。唯一的解决方案是制作一个“手持式”排序算法。

这是工作解决方案:

arr.sort(function(a,b) {
    function getCode(c) {
        c=c.toLowerCase();
        if (c.substring(0,2)=='aa') return 300; 
        switch (c.charCodeAt(0)) {
            case 229 : //å
                return 299;
                break;
            case 248 : //ø
                return 298;
                break;
            case 230 : //æ
                return 297;
                break;
            default : 
                return c.charCodeAt(0);
                break;
        }
    }
    return getCode(a) - getCode(b);
});
Run Code Online (Sandbox Code Playgroud)

测试数组

var arr = ['Ølby', 'Ålestrup', 'Ærø', 'Almindingen', 'Aalborg', 'Sorø'];
Run Code Online (Sandbox Code Playgroud)

按地区排序为

["Ølby", "Ærø", "Ålestrup", "Sorø", "Almindingen", "Aalborg"]
Run Code Online (Sandbox Code Playgroud)

这是完全错误的。上面的函数对数组进行正确排序:

["Almindingen", "Sorø", "Ærø", "Ølby", "Ålestrup", "Aalborg"]
Run Code Online (Sandbox Code Playgroud)

更新

@tibos 是绝对正确的。上面的算法只是按第一个字母排序。下面的函数根据上述算法的排序方案将字符串转换为整数数组。然后它比较整数数组 - 这样,字符串按其全长排序:

var arr = ['Ølby', 'Ålestrup', 'Ærø', 'Almindingen', 'Aalborg', 'Sorø'];
Run Code Online (Sandbox Code Playgroud)

测试数组:

var arr = ['Ølby', 'Ålborg', 'Århus', 'Ålestrup', 'Åkikrkeby', 'Ærø', 'Almindingen', 'Aalborg', 'Sorø'];
Run Code Online (Sandbox Code Playgroud)

现在按全长排序:

["Almindingen", "Sorø", "Ærø", "Ølby", "Åkikrkeby", "Ålborg", "Ålestrup", "Århus", "Aalborg"]
Run Code Online (Sandbox Code Playgroud)