JavaScriptで配列内の2番目に多い要素を検索する方法
配列内で2番目に多く出現する要素を見つける
今回は、文字列(または数値の配列)を受け取り、その中で2番目に出現回数が多い要素を返すJavaScript関数を作成します。
例として、次のような配列を考えてみましょう。
const arr = [1, 34, 4, 3, 2, 1, 4, 6, 4, 6, 5, 3, 6, 6];
この配列で最も頻繁に現れる要素は 6(4回出現)です。しかし、今回求めたいのは2番目に頻繁な要素、つまり 4(3回出現)です。
実装の考え方
処理の手順は以下の通りです。
reduce()を使って、各要素の出現回数をMapオブジェクトに記録します。Mapを[要素, 出現回数]> のペアを持つ配列に変換します。- 出現回数の降順にソートし、インデックス
1(2番目)の要素を取得します。
コード例
const arr = [1, 34, 4, 3, 2, 1, 4, 6, 4, 6, 5, 3, 6, 6];
const secondMostFrequent = arr => {
// 各要素の出現回数をMapに集計
const map = arr.reduce((acc, val) => {
if (acc.has(val)) {
acc.set(val, acc.get(val) + 1);
} else {
acc.set(val, 1);
}
return acc;
}, new Map());
// Mapを[値, 回数]の配列に変換し、出現回数の降順でソート
const frequencyArray = Array.from(map);
// 2番目に多い要素を返す
return frequencyArray.sort((a, b) => b[1] - a[1])[1][0];
};
console.log(secondMostFrequent(arr));出力結果
コンソールには次のように表示されます。
4
補足:より簡潔に書く方法
集計部分は、Map の特性を活かして以下のように短縮することもできます。
const secondMostFrequent = arr => {
const map = new Map();
arr.forEach(val => map.set(val, (map.get(val) || 0) + 1));
return [...map].sort((a, b) => b[1] - a[1])[1][0];
};
console.log(secondMostFrequent(arr)); // 4この関数は数値だけでなく、文字列の配列にもそのまま適用できます。たとえば ['a', 'b', 'b', 'c', 'c', 'c', 'd'] のような配列に対しても、同じロジックで2番目に多い文字(この場合は 'b')を取得できます。
-
JavaScriptのfind()関数とは?配列から条件に合う最初の要素を取得する方法
JavaScriptのfind()メソッドは、配列の中から指定した条件を満たす最初の要素の値を返すために使用されます。条件を満たす要素がひとつも存在しない場合は、undefinedが返されます。find()は配列全体を走査しますが、条件に一致する要素が見つかった時点で処理を終了するため、効率的に目的の要素を取得できるのが特徴です。find()の基本構文array.find(function(val, index, arr), thisValue)パラメータの説明function:各要素に対して実行されるテスト関数val:現在処理中の要素の値(必須)index:現在処理中の要素のインデックス番号
-
JavaScriptのArray.prototype.find()メソッドとは?使い方をサンプルコードで解説
Array.prototype.find() メソッドは、配列の中から指定した条件(テスト関数)を満たす最初の要素の値を返します。 条件に一致する要素が見つかった時点で検索を終了するため、大きな配列でも効率的に動作します。また、どの要素も条件を満たさなかった場合は undefined を返すという点も重要な特徴です。 find()メソッドの基本構文 arr.find(callback(element[, index[, array]])[, thisArg]) callback:各要素に対して実行されるテスト関数。true を返した要素が結果となります。 thisArg(省略可):callb