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

JavaScriptで単位が混在する重量値の配列を並べ替える方法

問題

グラム(G)、キログラム(KG)、トン(T)という3つの単位が混在した重量値を含む文字列の配列を受け取り、軽い順から重い順に並べ替えるJavaScript関数を作成する必要があります。

課題となるのは、単位が異なるため文字列同士を直接比較できないという点です。そこで、まず各値を共通の単位(ここではキログラム)に変換してから比較を行うアプローチが有効です。

解決策

以下の手順で実装します。

  • 各文字列の末尾から単位(G / KG / T)を判定する
  • 数値部分を抽出し、単位に応じてキログラム基準の値へ変換する(T は 1000 倍、G は 0.001 倍)
  • Array.prototype.sort() のコールバック内で変換後の値を比較する

コード例

const arr = ['1456G', '1KG', '.5T', '.005T', '78645G', '23KG'];
const arrangeWeights = (arr = []) => {
    const sorted=(w)=>{
        if(w.slice(-2) === 'KG'){
            return +w.slice(0,-2) * 1;
        }else if(w.slice(-1)==='T'){
            return +w.slice(0, -1)*1000
        }else{
            return +w.slice(0, -1)*0.001;
        };
    };
    return arr.sort((a, b) => sorted(a) - sorted(b));
};
console.log(arrangeWeights(arr));

コードの解説

内部関数 sorted では、slice() を使って文字列の末尾から単位を切り出して判定しています。

  • KG の場合: 末尾2文字が「KG」であることを確認し、それ以外の部分を数値化してそのまま返します。
  • T の場合: 末尾1文字が「T」なので、数値部分に 1000 を掛けます(1トン = 1000kg)。
  • G の場合: 上記以外はグラムとみなし、数値部分に 0.001 を掛けます(1g = 0.001kg)。

最後に sort() メソッドのコールバックで、変換後の値同士の差を返すことで、配列を昇順(軽い順)に並べ替えています。

出力結果

[ '1KG', '1456G', '.005T', '23KG', '78645G', '.5T' ]

元の文字列表記はそのまま維持されながら、実際の重さの順序(1kg → 1.456kg → 5kg → 23kg → 78.645kg → 500kg)に正しく並べ替えられていることがわかります。

  1. JavaScriptのslice()メソッドとは?配列から要素を抽出する方法を実例付きで解説

    slice()メソッドの基本JavaScriptのslice()メソッドは、配列の中から指定した範囲の要素を選び出し、新しい配列として返すメソッドです。元の配列は変更されずそのまま残るため、安全に部分的なデータを取り出したい場合に活用できます。基本構文array.slice(start, end)start:抽出を開始する位置を示す整数(インデックス番号)です。end:抽出を終了する位置を示す整数で、この位置にある要素自体は結果に含まれません。それでは、実際にslice()メソッドをJavaScriptで使ってみましょう。例1:配列の一部を切り取って表示する<!DOCTYPE html&

  2. JavaScriptのslice()メソッドとは?配列から要素を取り出す使い方を実例で解説

    JavaScriptのslice()メソッドは、大きな配列の中から選択した範囲の要素を抜き出し、新しい配列として返すメソッドです。最大の特徴は、元の配列を一切変更しない(非破壊的な操作)という点にあります。そのため、元データを保持したまま部分的なコピーを作りたい場合に非常に便利です。 slice()メソッドの基本構文 arr.slice(start, end) start:取り出しを開始するインデックス番号(省略可・デフォルトは0) end:取り出しを終了する位置の直前のインデックス番号(省略可・デフォルトは配列の末尾まで)。endで指定した要素自体は結果に含まれない点に注意してください。