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

JavaScriptでJSONオブジェクト内の最小値を効率的に取得する方法

JSONオブジェクトから最小値を取り出すJavaScript関数

文字列のキーに数値がマッピングされたJSONオブジェクトを、唯一の引数として受け取るJavaScript関数を作成することを考えてみましょう。この関数の役割は、オブジェクト内のすべての値を走査し、その中で最も小さい値を見つけて返すことです。

実装例

実際のコードは以下のようになります。

const obj = {
    "a": 4,
    "b": 2,
    "c": 5,
    "d": 1,
    "e": 3
};
const findSmallestValue = obj => {
    const smallest = Object.keys(obj).reduce((acc, val) => {
        return Math.min(acc, obj[val]);
    }, Infinity);
    return smallest;
}
console.log(findSmallestValue(obj));

出力結果

コンソールには次のように表示されます。

1

コードの解説

このコードがどのように動作するのか、順を追って見ていきましょう。

1. Object.keys()でキーの一覧を取得

まずObject.keys(obj)を使うことで、オブジェクトが持つすべてのキー(ここでは "a"〜"e")を配列として取得します。これにより、オブジェクトの各プロパティへ簡単にアクセスできるようになります。

2. reduce()で値を順番に比較

続いて、取得したキーの配列に対してreduce()メソッドを呼び出します。コールバック関数内ではMath.min(acc, obj[val])により、それまでの累積値(acc)と現在のキーに対応する値を比較し、常に小さい方を次の累積値として引き継ぎます。

3. 初期値としてInfinityを設定

reduce()の第2引数にはInfinityを指定しています。これは「無限大」という特殊な数値で、どのような実数よりも大きいため、最初の比較で必ずオブジェクト側の値が採用されます。これにより、空のオブジェクトが渡された場合でもエラーにならずInfinityが返されるという安全な挙動になります。

代替手段:Math.minとスプレッド構文を使う方法

より簡潔に書きたい場合は、Object.values()とスプレッド構文を組み合わせる方法もあります。

const findSmallestValue = obj => Math.min(...Object.values(obj));
console.log(findSmallestValue(obj)); // 1

ただし、この方法はオブジェクトのサイズが非常に大きい場合、スプレッド構文による引数展開でスタック制約にかかる可能性があるため、大規模なデータには先ほどのreduce()を使ったアプローチの方が適しています。

  1. JavaScriptのImage()オブジェクトとは?使い方とサンプルコードを解説

    JavaScriptにおけるImage()オブジェクトは、HTMLの<img>要素を表すオブジェクトです。このオブジェクトを使うことで、JavaScriptから動的に画像を生成し、Webページに追加することができます。Image()コンストラクタには、引数として画像の幅と高さをピクセル単位で指定できます。また、生成した画像オブジェクトのsrcプロパティに画像のURLを設定することで、画像を読み込むことが可能です。Image()オブジェクトの基本的な使い方以下は、JavaScriptでImage()オブジェクトを使用するサンプルコードです。コード例<!DOCTYPE html&

  2. JavaScriptで「良い基数(Good Base)」の最小値を求めるアルゴリズム

    良い基数(Good Base)とは= 2)のことを「良い基数(Good Base)」と呼びます。例えば、13 を基数 3 で表すと 111 となるため、3 は num = 13 における良い基数です。問題の概要数値を表す文字列 str を唯一の引数として受け取り、str の良い基数となる最小の数値を文字列形式で返す JavaScript 関数を作成する必要があります。例えば、関数への入力が以下の場合:const str = "4681";出力は次のようになります。const output = "8";出力の説明これは、4681 を基数 8 で表すと 11