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

JavaScriptでオブジェクトの数値を指定範囲に正規化する方法

はじめに

データの前処理や可視化を行う際、オブジェクト内の数値を特定の範囲(レンジ)に合わせてスケーリングしたいケースはよくあります。本記事では、オブジェクトの値を指定した範囲に正規化するJavaScript関数の実装方法を解説します。

問題の定義

まず、文字列キーと数値がマッピングされた次のようなオブジェクトを考えてみましょう。

const obj = {
    num1: 45,
    num2: 78,
    num3: 234,
    num4: 3,
    num5: 79,
    num6: 23
};

ここで求められているのは、このようなオブジェクトを第一引数として受け取り、厳密に2つの数値からなる配列を第二引数として受け取るJavaScript関数を作成することです。

第二引数は正規化先の範囲を表します。

[a, b] (b >= a)

つまり、オブジェクトの値をこの範囲に従って正規化します。具体的には、以下のルールが適用されます。

  • オブジェクト内の最大値b(範囲の上限)になる
  • オブジェクト内の最小値a(範囲の下限)になる
  • それ以外の値は、元の値同士の比率を保ったまま範囲内に比例配分される

実装コード

以下が実際のコード例です。

const obj = {
    num1: 45,
    num2: 78,
    num3: 234,
    num4: 3,
    num5: 79,
    num6: 23
};
const range = [10, 15];
const normaliseObject = (obj, range) => {
    const values = Object.values(obj);
    const min = Math.min.apply(Math, values);
    const max = Math.max.apply(Math, values);
    const variation = (range[1] - range[0]) / (max - min);
    Object.keys(obj).forEach(el => {
        const val = (range[0] + ((obj[el] - min) * variation)).toFixed(2);
        obj[el] = +val;
    });
};
normaliseObject(obj, range);
console.log(obj);

コードの仕組み

処理の流れを順番に見ていきましょう。

  1. Object.values() ですべての値を配列として取得し、Math.min.apply()Math.max.apply() で最小値・最大値を求めます。
  2. 変換係数 variation を「(範囲の幅) ÷ (元データの幅)」として計算します。これにより、元データのスケールをターゲット範囲のスケールへ縮小・拡大できます。
  3. 各値に対して「range[0] + (値 − 最小値) × variation」という線形変換を適用し、toFixed(2) で小数第2位に丸めた後、単項プラス演算子 + で再び数値型に戻しています。

出力結果

コンソールには以下の出力が表示されます。

{
    num1: 10.91,
    num2: 11.62,
    num3: 15,
    num4: 10,
    num5: 11.65,
    num6: 10.43
}

ご覧のとおり、元の最小値である num4: 3 が範囲の下限 10 に、元の最大値である num3: 234 が範囲の上限 15 に変換され、その他の値もそれぞれの比率を保ったまま範囲内に調整されていることが確認できます。

まとめ

この手法は線形正規化(Min-Maxスケーリング)として知られる基本的なデータ変換テクニックであり、チャート描画や機械学習の前処理など、さまざまな場面で活用できます。Math.min.apply(Math, ...) の部分は、よりモダンな書き方では Math.min(...values)(スプレッド構文)に置き換えることも可能です。

  1. JavaScriptのRegExp(正規表現)オブジェクトとは?基本の使い方をわかりやすく解説

    RegExp(正規表現)オブジェクトは、テキストに対してパターンマッチングを行い、目的の文字列部分を検索・抽出するために使用されます。JavaScriptでは、RegExpオブジェクトを「RegExpコンストラクタ」または「リテラル構文」の2通りの方法で作成できます。 RegExpオブジェクトの作成方法 コンストラクタを使用する場合: new RegExp(pattern) リテラル構文を使用する場合: /pattern/ 主なメソッド test():文字列がパターンに一致するかどうかを真偽値(true / false)で返します。 exec():パターンに一致した文字列を返します。

  2. JavaScriptのオブジェクト初期化子とは?使い方をサンプルコードで解説

    オブジェクト初期化子とは オブジェクト初期化子(Object Initializer)は、新しく生成したオブジェクトを初期化するための式です。波括弧 {} の中に、「プロパティ名」と「それに対応する値」のペアを0個以上、カンマ区切りで列挙して記述します。 これにより、変数宣言と同時にオブジェクトの中身を簡単に定義することができます。 以下は、JavaScriptでオブジェクト初期化子を使用したサンプルコードです。 サンプルコード <!DOCTYPE html> <html lang="en"> <head> <meta chars