簡體   English   中英

語言特定的字符基本字母和排序

[英]language specific chars base letter and sorting

我正在嘗試打印出已排序的項目列表,並將每個項目的首字母打印為“組”標題。 該代碼在客戶端使用。 排序工作得很好,問題在於在另一個語言環境中對特定於語言的字符進行排序時。 例如,在大多數語言環境中, å在en-GB中將å視為añ中將ñ視為n 有沒有一種通用的方法可以確定字符是否“屬於” js中的語言環境?

  • Å具有基部aen-USes-ES ,不應該被印刷
  • Å應該以sv-SE打印
  • Ñen-USsv-SEn為底,不應打印
  • Ñ應該在es-ES打印

鏈接到jsbin

包括最簡單的示例來顯示問題:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM