5

オブジェクトのプロパティに基づいてオブジェクトの配列をソートしようとしていnameます。'Æ' で始まる名前がいくつかありますが、'Ae' であるかのように並べ替えたいと思います。私の現在の解決策は次のとおりです。

myArray.sort(function(a, b) {
  var aName = a.name.replace(/Æ/gi, 'Ae'),
      bName = b.name.replace(/Æ/gi, 'Ae');
  return aName.localeCompare(bName);
});

すべての特殊文字を手動で置き換えることなく、これを処理するより良い方法があるはずだと思います。これは可能ですか?

違いがあれば、Node.jsでこれを行っています。

4

1 に答える 1

5

これ以上簡単な方法はありません。残念ながら、少なくとも移植性が懸念される場合、質問で説明されている方法でさえ単純すぎます。

このlocaleCompareメソッドは定義上実装依存であり、通常は基盤となるオペレーティング システムの UI 言語に依存しますが、同じコンピューター内のブラウザー (または他の JavaScript 実装) 間でも異なる場合があります。そのため、移植性のないコードを作成することを目的としている場合でも、どの照合順序が適用されているかを確認するために多くのテストを行う必要がある場合があります。参照。文字列の並べ替えは、思ったより難しいです。

したがって、制御されたポータブルな比較を行うには、自分のニーズに合った他の人のコードを幸運にも見つけられない限り、自分でコーディングする必要があります。良い面としては、大文字と小文字の変換メソッドはローカライズ対応の JavaScript の数少ない部分の 1 つです。これらは Unicode の大文字と小文字のマッピング規則を適用するため、たとえば'æ'.toUpperCase()、どの実装でも Æ が生成されます。

一般に、文字列の並べ替えには複雑な関数が必要です。これは、言語に対して定義された特定の並べ替え規則、または汎ヨーロッパの並べ替え規則 (多言語コンテンツ向け) などの他の規則によって適用されます。しかし、Ascii に加えてほんの一握りの文字を処理するソート ルールに制限できる場合は、次の単純化されたドイツ語のソートのようなコードを使用できます ( Going Global with JavaScript and Globalize.jsからの抜粋)。

String.prototype.removeUmlauts = function () {
  return this.replace(/Ä/g,'A').replace(/Ö/g,'O').replace(/Ü/g,'U');
}; 
function alphabetic(str1, str2) {
  var a = str1.toUpperCase().removeUmlauts();
  var b = str2.toUpperCase().removeUmlauts();
  return a < b ? -1 : a > b ? 1 : 0;
}

replace(/Æ/gi, 'Ae')出現する可能性のある文字を分析し、それらの処理方法を決定した後、これになどの他のマッピングを追加できます。分音記号を削除する (例: É を E にマッピングする) ことは単純ですが、多くの場合は十分であり、É が Z の後のどこかにあるかどうかを実装に任せるよりも確実に優れています。他のユーザーがあなたのコードが(彼らの環境で)すべて間違っていると不平を言うのを待つのではなく、物事がうまくいかず、修正が必要です。

于 2012-09-10T04:55:58.053 に答える