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

时间:2013-12-11 13:49:22

标签: javascript sorting locale

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

  

[奥尔堡,索罗......]

2 个答案:

答案 0 :(得分:4)

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

var arr = ['Aalborg', 'Sorø']; // array to sort
var myLocale = 'da-DK'; // danish locale

var sortedArr = arr.sort(function(a,b) { return a.localeCompare(b, myLocale); }); // sort

console.log(sortedArr);

对于更多浏览器agnostinc解决方案,您有两种选择:

  1. 填充localeCompare函数(或仅用丹麦语替换它)
  2. 更改整个排序算法
  3. 对于这个任务,我会使用类似bucket-sort的算法,理论上它应该比默认排序运行得更快(它会进行最小数量的比较)。

    一般的想法是你浏览每个字符串,根据第一个字母将它们放入(已排序)桶中。您继续按照第二个字母拆分包含至少2个字符串的每个桶,然后按第三个字母拆分,依此类推。最后,您将合并存储桶,并获得已排序的数组。

答案 1 :(得分:4)

不幸的是@Tibos解决方案无效。丹麦语æøå不像丹麦人所期望的那样可以排序。它肯定不适用于aa,它被视为oldschool å。唯一的解决方案是制作“手持式”排序算法。

这是工作解决方案:

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

测试数组

var arr = ['Ølby', 'Ålestrup', 'Ærø', 'Almindingen', 'Aalborg', 'Sorø'];

按区域设置排序为

["Ølby", "Ærø", "Ålestrup", "Sorø", "Almindingen", "Aalborg"]

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

["Almindingen", "Sorø", "Ærø", "Ølby", "Ålestrup", "Aalborg"]

<强>更新

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

arr.sort(function(a,b) {
    var d, e, f;
    function getIntArray(c) {
        var array=[];
        c=c.toLowerCase();
        for (var i=0;i<c.length;i++) {
            if (c.substring(i,2)=='aa') {
                array.push(300); 
                i++;
            } else {
                switch (c.charCodeAt(i)) {
                    case 229 : //å
                        array.push(299);
                        break;
                    case 248 : //ø
                        array.push(298);
                        break;
                    case 230 : //æ
                        array.push(297);
                        break;
                    default : 
                        array.push(c.charCodeAt(i));
                        break;
                }
            }
        }
        return array;
    }
    d=getIntArray(a);
    e=getIntArray(b);
    for (f=0;f<d.length;f++) {
        if (d[f]!=e[f]) {
            return d[f] - e[f];
        }
    }
});

测试数组:

var arr = ['Ølby', 'Ålborg', 'Århus', 'Ålestrup', 'Åkikrkeby', 'Ærø', 'Almindingen', 'Aalborg', 'Sorø'];

现在按全长排序:

["Almindingen", "Sorø", "Ærø", "Ølby", "Åkikrkeby", "Ålborg", "Ålestrup", "Århus", "Aalborg"]