【JavaScript】オブジェクトのプロパティ値から最大値を持つキーと値を取得する方法
問題の概要
JavaScriptでは、オブジェクトに含まれるプロパティ値の中から最大値を特定し、対応するキーと値のペアを取得したい場面がよくあります。本記事では、その具体的な実装方法をわかりやすく解説します。
例として、ある施設の評価基準ごとのスコアを格納した次のようなオブジェクトを考えてみましょう。
const rating = {
"overall": 92,
"atmosphere": 93,
"cleanliness": 94,
"facilities": 89,
"staff": 94,
"security": 92,
"location": 88,
"valueForMoney": 92
}
このようなオブジェクトを受け取り、最も高い値を持つキーと値のペアを返すJavaScript関数を作成する必要があります。
なお、このオブジェクトでは「cleanliness」と「staff」がともに最高値の94となっています。後述のコードでは、ループ処理によって最初に一致したキーが返されるため、出力は「cleanliness」のペアになります。
const output = {
"cleanliness": 94
};
実装コード
以下が実際のコードです。
const rating = {
"overall": 92,
"atmosphere": 93,
"cleanliness": 94,
"facilities": 89,
"staff": 94,
"security": 92,
"location": 88,
"valueForMoney": 92
}
const findHighest = obj => {
const values = Object.values(obj);
const max = Math.max.apply(Math, values);
for(key in obj){
if(obj[key] === max){
return {
[key]: max
};
};
};
};
console.log(findHighest(rating));
コードの解説
この関数は、次のステップで動作します。
- Object.values() — オブジェクトのすべての値を配列として取得します。
- Math.max.apply() — 取得した配列から最大値を算出します。
applyメソッドを使うことで、配列の各要素を個別の引数としてMath.maxに渡すことができます。 - for...inループ — オブジェクトの各キーを順番に走査し、最大値と一致するプロパティが見つかった時点で、そのキーと値をオブジェクト形式(計算されたプロパティ名
[key]を使用)で返します。
出力結果
このコードをコンソールで実行すると、次の出力が得られます。
{ cleanliness: 94 }
まとめ
オブジェクトから最大値を持つエントリを取得するには、Object.values()で値の一覧を取得し、Math.max.apply()で最大値を求め、for...inループで該当するキーを探すのがシンプルで効果的です。ただし、同点の最大値が複数存在する場合は、最初に見つかったキーのみが返されるという点に注意してください。すべての同率トップを取得したい場合は、filterなどを組み合わせることで対応できます。
-
JavaScriptでURLからGETパラメータの値を取得する方法
JavaScriptでは、URLオブジェクトとsearchParamsプロパティを組み合わせることで、URLに含まれるGETパラメータ(クエリ文字列)の値を簡単に取得できます。本記事では、実際のコード例とともにその手順をわかりやすく解説します。 実装例 以下は、サンプルURL「https://www.google.com?imageSize=440&color=blue」から、imageSizeとcolorという2つのGETパラメータの値を取り出して画面に表示するコード例です。 <!DOCTYPE html> <html lang=ja> <head>
-
JavaScriptでn番目の偶数を返す関数を実装する方法
問題 今回は、数値 n を引数として受け取り、自然数の中で n番目の偶数 を返すJavaScript関数を作成します。 n番目の偶数は、0から数え始めると「0, 2, 4, 6, …」という並びになります。つまり、n番目の偶数は次の式で求められます。 n番目の偶数 = 2 × (n − 1) 考え方 コードでは、まず引数を2倍した値(次の偶数)を求め、そこから2を引くことで目的の偶数を計算しています。この方法なら、ループ処理を使わずにO(1)の定数時間で結果を得られるのがポイントです。 コード例 以下が実装コードです。 { // nを2倍して