我正在尝试打印出已排序的项目列表,并将每个项目的首字母打印为“组”标题。该代码在客户端使用。 。
排序工作得很好,问题在于在另一个语言环境中对特定于语言的字符进行排序时。例如,在大多数语言环境中,将å
视作en-GB中的a
,将ñ
视作n
。
有什么通用的方法可以确定字符是否“属于” js中的语言环境?
Å
在a
和en-US
中以es-ES
为基础,不应打印Å
应该以{{1}} sv-SE
在Ñ
和n
中以en-US
为底,不应为
印刷sv-SE
应该以{{1}} 包括最简单的示例来显示问题:
Ñ
答案 0 :(得分:0)
解决了以下so question
中的一些提示console.clear();
var sortedItems;
var locales = ['en-US', 'es-ES', 'sv-SE', 'de-DE'];
var items = ['am', 'ån', 'ao', 'na', 'ñb', 'nc', 'ua', 'üb', 'uc', 'va' ];
strFromLocale = (str, locale) => {
match = (letter) => {
letterMatch = (letter, normalizedLetter) => {
var location = new Intl.Collator(locale, { usage: 'search', sensitivity: 'base' }).compare(letter, normalizedLetter);
return (location == 0)
}
normalizedLetter = letter.normalize('NFD').replace(/[\u0300-\u036f]/gi, "")
if ( letterMatch(letter, normalizedLetter) ) {
return normalizedLetter;
} else {
return letter;
}
}
return str.replace(/[^\u0000-\u007E]/g, match);
}
sortAlphabetically = (array, locale) => {
const sortFunc = (a, b) => a.localeCompare(b, locale, { usage: 'search', sensitivity: 'base' });
return array.sort(sortFunc);
}
render = (sortedItems, locale) => {
const processedLetters = {};
const res = sortedItems.map((item, index) => {
const firstLetter = strFromLocale(item[0].toUpperCase(), locale);
if (!processedLetters[firstLetter]) {
processedLetters[firstLetter] = true;
console.log(firstLetter);
}
console.log(item);
});
}
locales.map(locale => {
console.log('\n' + 'Using locale: ' + locale);
sortedItems = sortAlphabetically(items, locale);
render(sortedItems, locale);
})