JavaScriptで英数字が混在した配列をアルファベット順・数字順にソートする方法
はじめに
JavaScriptでは、英字と数字が混在した文字列の配列を並べ替えたい場面がよくあります。例えば「Ab-1」「ab-10」のような文字列を、まずアルファベット順に、同じ英字同士は数字の昇順でソートしたいケースです。しかし、単純にsort()を呼び出すだけでは、文字列として先頭から比較されるため、「ab-10」が「ab-2」より前に来てしまうなど、意図した順序になりません。
そこで本記事では、文字列を英字部分と数字部分に分けて比較する、カスタムソート関数の実装方法を解説します。
対象となる配列
次のような英数字が混在した配列を並べ替えます。
const arr = ['Ab-1', 'Ab-11', 'Ab-12', 'ab-10', 'ab-100', 'ab-101', 'ab-2', 'ab-3', 'ab-105'];
ソート用コードの実装
並べ替えを行うコードは以下の通りです。
const arr = ['Ab-1', 'Ab-11', 'Ab-12', 'ab-10', 'ab-100', 'ab-101', 'ab-2', 'ab-3', 'ab-105'];
const alphaNumericSort = (arr = []) => {
arr.sort((a, b) => {
const aPart = a.split('-');
const bPart = b.split('-');
return aPart[0].toLowerCase().localeCompare(bPart[0].toLowerCase()) || aPart[1] - bPart[1];
});
};
alphaNumericSort(arr);
console.log(arr);
コードのポイント
- 文字列の分割:
split('-')で各要素をハイフン区切りに分解し、英字部分と数字部分を取得します。 - 大文字・小文字の無視:
toLowerCase()で英字部分を小文字に統一し、「Ab」と「ab」を同じ文字として扱います。 - 英字部分の比較:
localeCompare()により、辞書順(アルファベット順)で比較します。 - 数字部分の比較:
||演算子を使い、英字部分が同一の場合のみ数字部分を比較します。文字列同士の引き算は数値として評価されるため、「2」と「10」も正しく数値順に並びます。
実行結果
コンソールには次のように出力されます。
[
'Ab-1', 'ab-2',
'ab-3', 'ab-10',
'Ab-11', 'Ab-12',
'ab-100', 'ab-101',
'ab-105'
]
英字部分がアルファベット順に並べ替えられ、同じ英字を持つ要素は数字部分の昇順に正しくソートされていることがわかります。
まとめ
英数字が混在した配列をソートするには、文字列を英字部分と数字部分に分割し、それぞれに適した比較方法を組み合わせたカスタム比較関数をsort()に渡すのが有効です。この手法は、ファイル名やバージョン番号、商品コードなど、英字と数字が組み合わさったデータの並べ替えに幅広く応用できます。
-
Firebugを使ったJavaScriptデバッグ徹底ガイド|基本機能から実践手順まで
デバッグとは何か デバッグとは、ソフトウェアから欠陥(バグ)を体系的に取り除くプロセスのことです。作業はテストケースの実行から始まります。テストケースを実行すると、実際の結果と期待される結果が比較され、両者に不一致があれば根本原因の分析が行われます。さらに、リグレッションテストなどの追加テストを実施することで、結果が期待どおりのラインに沿っていることを確認します。 静的なWebページの作成にはHTMLが広く使われています。一方、動的なWebアプリケーションを開発するには、Webのスクリプト言語であるJavaScriptが欠かせません。コードをバグのない状態に保つため、プログラマーはさまざまなデ
-
JavaScriptのimportで波括弧「{}」を使う理由とは?名前付きエクスポートの基本をわかりやすく解説
JavaScript(ESモジュール)でモジュールを読み込む際、import 文に波括弧 { } を付けるかどうか迷ったことはありませんか?実はこの波括弧は、名前付きエクスポート(named export)を読み込むために必要な記法です。本記事では、実際のコード例を使いながら、{ } の役割と使い方を詳しく解説します。 importで { } を使う場面とは JavaScriptのESモジュールでは、エクスポート方法によって読み込み側の書き方が変わります。 名前付きエクスポート:export { 関数名 } のようにエクスポートされたものを読み込む場合は、import { 名前 } fro