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

JavaScriptで数値オブジェクトから指定値以上の最も近いキーを取得する方法

JavaScriptでは、複数の数値を持つオブジェクトの中から、入力として渡された特定の数値と同じ値、またはそれより大きい最も近い数値に対応するキーを取得したいケースがあります。本記事では、reduce() メソッドを活用したシンプルな実装方法を、コード例とともにわかりやすく解説します。

対象となるデータ

今回使用する数値の集合は、以下のようにキーと値のペアで定義されています。

const numbers = {
    A:107,
    B:112,
    C:117,
    D:127,
    E:132,
    F:140,
    G:117,
    H:127,
    I:132,
    J:132,
    K:140,
    L:147,
    M:117,
    N:127,
    O:132
};

実装の考え方

目標は「指定した値以上で、最も差が小さい数値」を持つキーを見つけることです。この処理は次の手順で実現できます。

  • Object.keys() でオブジェクトのすべてのキーを取得する
  • 各キーの値から入力値を引き、差分を計算する
  • 差分が 0以上(同じかそれより大きい) かつ、これまでの最小差分より小さい場合、そのキーを結果として採用する
  • 最小差分の初期値は Infinity にしておき、最初の比較が必ず成立するようにする

サンプルコード

const numbers = {
    A:107,
    B:112,
    C:117,
    D:127,
    E:132,
    F:140,
    G:117,
    H:127,
    I:132,
    J:132,
    K:140,
    L:147,
    M:117,
    N:127,
    O:132
};
const nearestHighest = (obj, val) => {
    let diff = Infinity;
    const nearest = Object.keys(obj).reduce((acc, key) => {
        let difference = obj[key] - val;
        if (difference >= 0 && difference < diff) {
            diff = difference;
            acc = [key];
        }
        return acc;
    }, [])
    return nearest;
};
console.log(nearestHighest(numbers, 140));

コードの解説

nearestHighest 関数は、第1引数に対象のオブジェクト、第2引数に基準となる数値を受け取ります。内部では reduce() を使い、各キーの値と入力値の差分を順番に評価しています。差分が0以上で現在の最小差分(diff)より小さければ、そのキーが新しい候補として配列に格納されます。この繰り返しにより、条件を満たす中で最も近い数値を持つキーだけが残ります。

なお、同じ値を持つキーが複数存在する場合は、先に見つかった1つのキーのみが返される点に注意してください。

実行結果

上記のコードを実行すると、コンソールには以下のように出力されます。

['F']

入力値は 140 であり、この値を持つキーは F のみです。したがって、完全一致するキーがそのまま結果として返されました。仮に入力値が138などの間の値であれば、それより大きく最も近い140を持つキーFが同様に返されます。

  1. JavaScriptで小数を検証するには?正規表現を使った実装例を解説

    JavaScriptで小数を検証する方法 JavaScriptで、ユーザーが入力した値が正しい小数(小数点を含む数値)かどうかを判定したい場面はよくあります。そんなときに便利なのが正規表現です。本記事では、match()メソッドと正規表現を組み合わせて、入力値が小数かどうかを検証する方法を、具体的なコード例とともにわかりやすく解説します。 使用する正規表現パターン 今回の検証では、以下の正規表現を使用します。 /^[-+]?[0-9]+\.[0-9]+$/ このパターンの各要素の意味は次のとおりです。 ^[-+]?:文字列の先頭に符号(+ または -)が付いていても、付いていなくてもマッチ

  2. JavaScriptでバラバラの数字名から数字を復元する方法

    問題 次のように、数字の英語名の文字が混ぜ込まれた文字列があるとします。 const str = 'TOWNE'; この文字列をよく観察すると、文字を組み合わせることで「TWO(2)」と「ONE(1)」という2つの数字名が見つけられます。 したがって、この場合に期待される出力は「21」です。 今回の課題は、このような文字列を引数として受け取り、その中に隠れている数字を検出して返すJavaScript関数を記述することです。 解き方のアプローチ この問題は、以下の手順で解決できます。 0〜9の各数字名(ZERO、ONE、TWOなど)について、考えられるすべての並べ替え(順列