如何排序特殊字母(打字稿)?

时间:2018-02-02 12:50:21

标签: javascript sorting typescript special-characters

我想用ts排序一些字母... sort方法和localCompare()以这种方式排序Ä,Å,Ö,而不是Å,Ä,Ö。如何对任何字母进行核心排序?

我有一个对象列表:

class MyObj { id:number,
name: string,
type:number
}

I tried var list: MyObj[] = a list of objects

list.sort(function (a, b) {
            return a.name.toUpperCase().localeCompare(b.name.toUpperCase());
        });

更新

是的,georg回答是正确的:我也发现了这个:

var strings = ["Ålex", "Ålex3", "Älex2"];
var sorter = new Intl.Collator("sv", { usage: "sort" });

strings.sort(sorter.compare);

同样的结果。

非常感谢!

非常重要

不要使用localCompare,因为它在执行时非常糟糕。

使用Intl.Collat​​or!

var browserLanguage = function () {
        const defaultLanguage = "en";
        const browserLanguage = this.window.navigator.language ||
            (this.window as any).navigator.browserLanguage;

        const currentLanguage = browserLanguage.split('-')[0];

        if (supportedLanguages.indexOf(currentLanguage) < 0) {
            return defaultLanguage;

        } else {
            return currentLanguage;
        }
}

const intlCollator = new Intl.Collator(browserLanguage, { usage: "sort" });

    list.sort(function (a, b) {
                return intlCollator.compare(a.toUpperCase(), b.toUpperCase());
            });

1 个答案:

答案 0 :(得分:1)

localeCompare显然取决于语言环境,不同的语言环境使用不同的规则(“排序规则”)来比较扩展字符。例如,在英语中,具有不同变音符号的A都是相同的,而瑞典语则以不同的方式对待它们:

console.log(["Älex2", "Ålex0", "Ålex3", "Alex1"].sort(( a, b ) => a.localeCompare(b, 'en')));

console.log(["Älex2", "Ålex0", "Ålex3", "Alex1"].sort(( a, b ) => a.localeCompare(b, 'sv')));