42

JavaScript で書いたところ を"Ł" > "Z"返しますtrue。Unicode の順序では、もちろんfalse. これを修正する方法は?私のサイトは UTF-8 を使用しています。

4

6 に答える 6

19

カスタムソートに役立つフランス語のアルファベットの例を次に示します。

var alpha = function(alphabet, dir, caseSensitive){
  return function(a, b){
    var pos = 0,
      min = Math.min(a.length, b.length);
    dir = dir || 1;
    caseSensitive = caseSensitive || false;
    if(!caseSensitive){
      a = a.toLowerCase();
      b = b.toLowerCase();
    }
    while(a.charAt(pos) === b.charAt(pos) && pos < min){ pos++; }
    return alphabet.indexOf(a.charAt(pos)) > alphabet.indexOf(b.charAt(pos)) ?
      dir:-dir;
  };
};

文字列の配列で使用するにはa:

a.sort(
  alpha('ABCDEFGHIJKLMNOPQRSTUVWXYZaàâäbcçdeéèêëfghiïîjklmnñoôöpqrstuûüvwxyÿz')
);

昇順または降順で並べ替えるには、1または-1の 2 番目のパラメーターとして追加します。大文字と小文字を区別して並べ替えるには、3 番目のパラメーターとして 追加します。alpha()
true

アルファベットリストに数字と特殊文字を追加する必要がある場合があります

于 2010-09-02T22:48:49.647 に答える
13

それを使用して独自のソート機能を構築できる場合がありますlocaleCompare()-少なくともトピックに関するMDCの記事によると-物事を正しくソートする必要があります。

それでもうまくいかない場合は、OPが文字列置換を使用して「ブルートフォース」ソートメカニズムを構築する興味深いSOの質問があります。

また、その質問では、OP は、ロケールを認識した並べ替えを行う jQuery tablesorter プラグインのカスタムtextExtract関数を作成する方法を示しています。これも一見の価値があります。

編集:完全に遠いアイデアとして-特にパフォーマンスの問題のために、これが実現可能かどうかはまったくわかりません-とにかくバックエンドでPHP/mySQLを使用している場合、可能性について言及したいと思いますAjax クエリを mySQL インスタンスに送信して、そこで並べ替えます。ORDER BY xyz COLLATE utf8_polish_cimySQL は、ロケール認識データのソートに優れています。たとえば、 ...を使用してソート操作を特定の照合に強制できるためです。COLLATE utf8_german_ciこれらの照合は、すべてのソートの問題を一度に処理します。

于 2010-09-02T20:00:41.717 に答える
9

言及されていない文字について改善された Mic のコード:

var alpha = function(alphabet, dir, caseSensitive){
  dir = dir || 1;
  function compareLetters(a, b) {
    var ia = alphabet.indexOf(a);
    var ib = alphabet.indexOf(b);
    if(ia === -1 || ib === -1) {
      if(ib !== -1)
        return a > 'a';
      if(ia !== -1)
        return 'a' > b;
      return a > b;
    }
    return ia > ib;
  }
  return function(a, b){
    var pos = 0;
    var min = Math.min(a.length, b.length);
    caseSensitive = caseSensitive || false;
    if(!caseSensitive){
      a = a.toLowerCase();
      b = b.toLowerCase();
    }
    while(a.charAt(pos) === b.charAt(pos) && pos < min){ pos++; }
    return compareLetters(a.charAt(pos), b.charAt(pos)) ? dir:-dir;
  };
};

function assert(bCondition, sErrorMessage) {
      if (!bCondition) {
          throw new Error(sErrorMessage);
      }
}

assert(alpha("bac")("a", "b") === 1, "b is first than a");
assert(alpha("abc")("ac", "a") === 1, "shorter string is first than longer string");
assert(alpha("abc")("1abc", "0abc") === 1, "non-mentioned chars are compared as normal");
assert(alpha("abc")("0abc", "1abc") === -1, "non-mentioned chars are compared as normal [2]");
assert(alpha("abc")("0abc", "bbc") === -1, "non-mentioned chars are compared with mentioned chars in special way");
assert(alpha("abc")("zabc", "abc") === 1, "non-mentioned chars are compared with mentioned chars in special way [2]");
于 2010-09-03T07:15:47.753 に答える