JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

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'
]
  1. JavaScriptでアクセント付き文字を含む文字列を並べ替える方法

    JavaScriptの標準的な sort() メソッドは、文字列をUnicodeコードポイントの順序に基づいて比較します。そのため、「é」や「ó」のようなアクセント付き文字を含む文字列を単純にソートすると、期待通りのアルファベット順にならないことがあります。この問題を解決するには、localeCompare() メソッドを使用します。このメソッドは、指定されたロケールの言語規則に従って文字列を比較できるため、アクセント付き文字も正しく並べ替えられます。localeCompare() の基本的な使い方以下は、スペイン語のアクセント付き文字を含む配列を localeCompare() を使ってソー

  2. JavaScriptでテンプレート文字列をネストする方法

    JavaScriptのES6で導入されたテンプレート文字列(テンプレートリテラル)は、バッククォート(`)で囲むことで文字列の中に変数や式を埋め込める便利な機能です。実は、この${}(プレースホルダー)の中に、さらに別のテンプレート文字列を入れ子(ネスト)として記述することもできます。テンプレート文字列のネストとは${}の中には任意のJavaScript式を書けるため、その中で再度バッククォートを使ったテンプレート文字列を評価することが可能です。これにより、関数呼び出しの引数として動的に生成した文字列を渡すなど、柔軟な文字列組み立てが行えます。コード例以下は、ボタンをクリックすると、ネストされ