【JavaScript】for...inループを使って最大出現回数の要素を求める方法
カンマ区切りの文字列に、次のように果物の名前が複数含まれているとします。
const str = 'Banana,Banana,Pear,Orange,Apple,Melon,Grape,Apple,Banana,Grape,Melon,Grape,Melon,Apple,Grape,Banana,Orange,Melon,Orange,Banana,Banana,Orange,Pear,Grape,Orange,Orange,Apple,Apple,Banana';
このような文字列を引数として受け取り、最も多く出現する果物名を特定するJavaScript関数を作成することを考えます。
関数は、出現回数が最多となる果物名を文字列として返す必要があります。
実装例:reduceとMapを使ったアプローチ
まずは、reduce()メソッドとMapオブジェクトを使って各果物の出現回数を集計し、並べ替えによって最大値を求める基本的な実装を見てみましょう。
const str =
'Banana,Banana,Pear,Orange,Apple,Melon,Grape,Apple,Banana,Grape,Melon,Grape,Melon,Apple,Grape,Banana,Orange,Melon,Orange,Banana,Banana,Orange,Pear,Grape,Orange,Orange,Apple,Apple,Banana';
const findMostFrequent = str => {
const strArr = str.split(',');
const creds = strArr.reduce((acc, val) => {
if(acc.has(val)){
acc.set(val, acc.get(val) + 1);
}else{
acc.set(val, 1);
}
return acc;
}, new Map());
return Array.from(creds).sort((a, b) => b[1] - a[1])[0][0];
};
console.log(findMostFrequent(str));for...inループを使った別の解法
タイトルのとおり、for...inループを使って最大値を求めたい場合は、出現回数を普通のオブジェクトに記録し、そのキーを順番に走査する方法がシンプルでおすすめです。
const findMostFrequent = str => {
// 出現回数をオブジェクトに集計
const counts = {};
for (const fruit of str.split(',')) {
counts[fruit] = (counts[fruit] || 0) + 1;
}
// for...inループでキーを走査し、最大の出現回数を持つ要素を特定
let maxFruit = '';
let maxCount = 0;
for (const fruit in counts) {
if (counts[fruit] > maxCount) {
maxCount = counts[fruit];
maxFruit = fruit;
}
}
return maxFruit;
};
console.log(findMostFrequent(str));出力
いずれのコードも、コンソールには次のように出力されます。
Banana
コードの解説
- split(','): 文字列をカンマで分割し、果物名の配列に変換します。
- 出現回数の集計: 各果物名をキーとして回数を記録します。
(counts[fruit] || 0)により、未登録の要素は0からカウントを開始できます。 - for...inループ: オブジェクトのキー(果物名)を順番に取り出しながら、これまでの最大回数より大きければ最大値と果物名を更新していきます。
この例では、Bananaが合計7回出現し、他のどの果物(Orangeは6回)よりも多いため、「Banana」が結果として返されます。
-
【初心者向け】JavaScriptのfor...ofループの使い方を実例つきで解説
JavaScriptのfor...ofループは、配列、文字列、配列風オブジェクト(Array-like objects)、NodeListなど、反復可能(イテラブル)なオブジェクトの要素を先頭から順番に1つずつ取り出して処理するための構文です。 インデックスの管理が不要なため、従来のforループやforEachメソッドと比べてコードが簡潔になり、可読性や保守性が向上するというメリットがあります。 for...ofループの基本構文 for (変数 of 反復可能オブジェクト) { // 各要素に対して実行したい処理 } サンプルコード 次の例では、for...ofループを使って文
-
JavaScriptのループを停止する方法|clearInterval()の使い方を解説
JavaScriptでsetInterval()によって繰り返し実行されている処理(ループ)を停止したい場合は、clearInterval()を使用します。setInterval()は指定した間隔ごとに関数を繰り返し呼び出すメソッドですが、そのままでは無限に処理が続いてしまいます。そこで、あらかじめ戻り値として取得したタイマーIDをclearInterval()に渡すことで、ループを任意のタイミングで止めることができます。コード例以下は、一定回数スクロール処理を繰り返した後にループを停止するサンプルコードです。<!DOCTYPE html> <html lang="