JavaScriptで小数点形式の文字列を昇順に並べ替える方法
まず、次のような文字列の配列を考えてみましょう。
const arr = [ '.0', '.1', '.2', '.4', '.2.1', '.3', '.4.1', '.5', '.5.1.5' ];
このような配列を引数として受け取り、一般の人が見て自然だと感じる順序、つまり昇順に並べ替えるJavaScript関数を作成します。ここでいう昇順とは、'.0' を先頭とし、続いて '.1'、'.2' というように数値の小さいものから順に並べることを意味します。
したがって、並べ替え後の配列は次のようになります。
const output = [ '.0', '.1', '.2', '.2.1', '.3', '.4', '.4.1', '.5', '.5.1.5' ];
ポイントは、'.2.1' のような複数階層を持つ文字列の扱いです。単純な文字列比較ではなく、各数値セグメントを個別に比較する必要があります。
コード例
この処理を実現するコードは以下の通りです。
const arr = [ '.0', '.1', '.2', '.4', '.2.1', '.3', '.4.1', '.5', '.5.1.5' ];
const compare = (a, b) => {
if (a === b) {
return 0
};
const aArr = a.split("."), bArr = b.split(".");
for (let i = 0; i < Math.min(aArr.length, bArr.length); i++) {
if (parseInt(aArr[i]) < parseInt(bArr[i])) {
return -1
};
if (parseInt(aArr[i]) > parseInt(bArr[i])) {
return 1
};
}
if (aArr.length < bArr.length) {
return -1
};
if (aArr.length > bArr.length) {
return 1
};
return 0;
};
arr.sort(compare);
console.log(arr);
仕組みの解説
この比較関数では、まず各文字列をピリオド(".")で split() メソッドにより分割し、それぞれの数値セグメントを左から順に比較していきます。たとえば '.2.1' であれば [2, 1] として扱われます。parseInt() を使うことで、文字列としてではなく数値として比較できるため、「10」と「9」のようなケースでも誤った順序になりません。
また、共通するセグメントがすべて等しい場合(例:'.2' と '.2.1')は、配列の長さを比較して、より短い(階層が浅い)文字列を先に配置します。この仕組みにより、ソフトウェアのバージョン番号のような階層構造を持つ文字列も、自然な順序で正確に並べ替えることが可能です。
実行結果
コンソールには次のように出力されます。
[
'.0', '.1',
'.2', '.2.1',
'.3', '.4',
'.4.1', '.5',
'.5.1.5'
]
-
JavaScriptでアクセント付き文字を含む文字列を並べ替える方法
JavaScriptの標準的な sort() メソッドは、文字列をUnicodeコードポイントの順序に基づいて比較します。そのため、「é」や「ó」のようなアクセント付き文字を含む文字列を単純にソートすると、期待通りのアルファベット順にならないことがあります。この問題を解決するには、localeCompare() メソッドを使用します。このメソッドは、指定されたロケールの言語規則に従って文字列を比較できるため、アクセント付き文字も正しく並べ替えられます。localeCompare() の基本的な使い方以下は、スペイン語のアクセント付き文字を含む配列を localeCompare() を使ってソー
-
JavaScriptでテンプレート文字列をネストする方法
JavaScriptのES6で導入されたテンプレート文字列(テンプレートリテラル)は、バッククォート(`)で囲むことで文字列の中に変数や式を埋め込める便利な機能です。実は、この${}(プレースホルダー)の中に、さらに別のテンプレート文字列を入れ子(ネスト)として記述することもできます。テンプレート文字列のネストとは${}の中には任意のJavaScript式を書けるため、その中で再度バッククォートを使ったテンプレート文字列を評価することが可能です。これにより、関数呼び出しの引数として動的に生成した文字列を渡すなど、柔軟な文字列組み立てが行えます。コード例以下は、ボタンをクリックすると、ネストされ