8

チェコ語の名前で配列をソートする際に問題があります。通常のキャラは使えるけど特殊キャラはダメ。'Sb', 'St', 'Šk' ; 特殊な Š は他の 2 つの単語の後にある必要がありますが、順序が異なります。ここに簡単なコードがあります。

var tmpArr = ['Sb', 'BE', 'De', 'CS', 'Au', 'Šk', 'De', 'St', 'Ci', 'št'];

function mySort(s1, s2) {
return s1.localeCompare(s2 ,'cz', {sensitivity: "variant"});
}

var sorted = tmpArr.sort(mySort);

console.log(tmpArr);

for(var i in sorted){
console.log(sorted[i]);
}

これは、すべてのブラウザーでも機能するはずです。

4

1 に答える 1

8

ドブリー・デン

これが述べているように

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare

ロケール比較の高度なオプションは、一般的なブラウザーには実装されていません。

これが Chech 言語にのみ必要な場合は、文字マップを使用して独自の文字列比較を実装することをお勧めします。

var charMapL = " 0123456789aábcčdďeéěfghiíjklmnňoópqrřsštťuúůvwxyýzž";
var charMapU = " 0123456789AÁBCČDĎEÉĚFGHIÍJKLMNŇOÓPQRŘSŠTŤUÚŮVWXYÝZŽ";
var charsOrder = {};
for(var i in charMapL.split('')) {
    charsOrder[charMapL[i]] = parseInt(i);
    charsOrder[charMapU[i]] = parseInt(i);
}

function mySort(s1, s2) {
    var idx = 0;
    while ( (idx < s1.length) && (idx < s2.length) && (charsOrder[s1[idx]] == charsOrder[s2[idx]])) {
        idx ++;
    }
    if ((idx == s1.length) && (idx == s2.length)) return 0;
    if (idx == s1.length) return 1;
    if (idx == s2.length) return -1;
    return charsOrder[s1[idx]] > charsOrder[s2[idx]] ? 1 : (charsOrder[s1[idx]] < charsOrder[s2[idx]] ? -1 : 0);
}

console.log(tmpArr);
tmpArr.sort();
console.log(tmpArr);
tmpArr.sort(mySort);
console.log(tmpArr);

http://jsfiddle.net/GNNBc/1/

于 2013-07-09T08:33:00.377 に答える