導入:なぜIntl.Collatorが必要なのか?
JavaScriptで配列を並び替える際、標準のsort()メソッドを使うと、日本語環境では意図しない結果になることがあります。特に、ひらがな、カタカナ、漢字が混在するリストや、全角・半角の扱い、大文字・小文字の区別など、単純な文字コード順のソートでは「自然な並び順」になりません。Intl.Collator APIは、ブラウザが持つ言語ごとのソート規則を利用し、人間にとって直感的な並び順を実現するための強力なツールです。
基礎知識:Intl.Collatorとは
Intl.Collatorは、ECMAScript Internationalization APIの一部で、言語に依存した文字列比較を行うためのコンストラクタです。通常の比較演算子(<, >)やlocaleCompare()と比較して、「一度インスタンスを作成すれば、再利用可能で高速」という大きなメリットがあります。特に大量のデータを処理する場合、毎回比較ルールを生成するコストを抑えられるため、パフォーマンス面で優れています。
実装/解決策
Intl.Collatorを利用するには、まずインスタンスを作成し、そのcompareメソッドをsort()の引数として渡します。コンストラクタのオプションで、大文字・小文字の無視(sensitivity)や、数値として比較するかどうか(numeric)を指定できるのが特徴です。
サンプルプログラム
以下のコードは、日本語の文字列を「自然な順序(ひらがな→カタカナ→漢字)」でソートする例です。
// 日本語向けにCollatorインスタンスを作成
// numeric: true を指定すると「1, 2, 10」のように数値の大小を正しく判定します
const collator = new Intl.Collator('ja', {
sensitivity: 'base',
numeric: true
});
const data = ['りんご', 'バナナ', 'イチゴ', 'みかん', '亜鉛', '愛'];
// compareメソッドをsortに渡すだけで完了
data.sort(collator.compare);
console.log(data);
// 出力結果: ['愛', '亜鉛', 'イチゴ', 'バナナ', 'みかん', 'りんご']
// 注: 環境やロケール設定により詳細な順序は前後することがあります
応用・注意点
現場で使う際に注意すべき点が2つあります。
1つ目は、「数値が含まれる文字列のソート」です。例えば「項目1」「項目10」「項目2」を並べる際、デフォルトのsort()では「項目1, 項目10, 項目2」となってしまいますが、numeric: trueを設定することで「項目1, 項目2, 項目10」と正しく並びます。
2つ目は、「ブラウザ間の挙動差」です。Intl APIはブラウザの内部エンジン(ICUなど)に依存するため、OSやブラウザのバージョンによって厳密なソート結果が微妙に異なる場合があります。厳密な順序がビジネスロジックとして重要な場合は、テスト環境で結果を検証し、必要に応じて独自の比較関数を組み合わせることをお勧めします。
適切に使いこなすことで、ユーザーにとって使いやすいUIを実現しましょう。