[英]language specific chars base letter and sorting
我正在嘗試打印出已排序的項目列表,並將每個項目的首字母打印為“組”標題。 該代碼在客戶端使用。 。 排序工作得很好,問題在於在另一個語言環境中對特定於語言的字符進行排序時。 例如,在大多數語言環境中, å
在en-GB中將å
視為a
在ñ
中將ñ
視為n
。 有沒有一種通用的方法可以確定字符是否“屬於” js中的語言環境?
Å
具有基部a
中en-US
& es-ES
,不應該被印刷 Å
應該以sv-SE
打印 Ñ
在en-US
和sv-SE
的n
為底,不應打印 Ñ
應該在es-ES
打印 包括最簡單的示例來顯示問題:
console.clear();
var sortedItems;
var uniqueStartLetters;
var locales = ['en-US', 'es-ES', 'sv-SE'];
var items = ['am', 'ån', 'ao', 'na', 'ñb', 'nc' ];
sortAlphabetically = (array, locale) => {
const sortFunc = (a, b) => a.localeCompare(b, locale, { sensitivity: 'base' });
return array.sort(sortFunc);
}
render = sortedItems => {
const processedLetters = {};
const res = sortedItems.map((item) => {
const firstLetter = item[0].toUpperCase();
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, uniqueStartLetters);
})
解決了以下問題的一些技巧
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);
})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.