【JS応用|豆知識】JavaScriptで「日本語のソート」を極める!Intl.Collator活用術

導入:なぜ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を実現しましょう。

タイトルとURLをコピーしました