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

JavaScriptで配列内の出現回数が2番目に多い要素を取得する方法

この記事では、リテラル値の配列を受け取り、その中で出現回数が2番目に多い要素を返すJavaScript関数の実装方法を解説します。

問題の概要

例として、入力配列が以下の場合を考えてみましょう。

const arr = [2, 5, 4, 3, 2, 6, 5, 5, 7, 2, 5];

この配列では、5が4回、2が3回出現しています。つまり、最も多く出現する要素は5であり、2番目に多く出現する要素は2です。したがって、期待される出力は次のようになります。

const output = 2;

アルゴリズムの流れ

  1. 空のオブジェクト(マップ)を作成し、各要素の出現回数を記録します。
  2. 配列を走査しながら、各要素のカウントを順次更新していきます。
  3. Object.keys(map)でキーの一覧を取得し、出現回数の降順にソートします。
  4. ソート後の配列からインデックス1(2番目)の要素を返します。

コード例

const arr = [2, 5, 4, 3, 2, 6, 5, 5, 7, 2, 5];
const findSecondMost = (arr = []) => {
    const map = {};
    arr.forEach(el => {
        if(map.hasOwnProperty(el)){
            map[el]++;
        } else {
            map[el] = 1;
        }
    });
    const sorted = Object.keys(map).sort((a,b) => map[b] - map[a]);
    return sorted[1];
};
console.log(findSecondMost(arr));

コードの解説

まず、オブジェクトmapを用意し、forEachで配列を走査しながら各要素の出現回数をカウントします。hasOwnPropertyを使うことで、要素がすでに登録されているかどうかを判定できます。

次に、Object.keys(map)でキーの一覧を取得し、比較関数(a,b) => map[b] - map[a]を指定したsort()によって、出現回数の降順に並べ替えます。最後に、並べ替えた配列のインデックス1を返せば、出現回数が2番目に多い要素が得られます。

なお、オブジェクトのキーはすべて文字列として扱われるため、戻り値を数値として利用したい場合はNumber(sorted[1])のように変換すると安全です。

出力結果

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

2
  1. 【JavaScript入門】配列内で最初の非連続な数値を見つける方法

    はじめに本記事では、JavaScriptを使って「数値の配列の中から、直前の要素と連続していない最初の数値」を見つける方法を解説します。アルゴリズムの練習やコーディング面接の対策としても役立つ基本的な問題です。 問題の定義数値の配列を受け取るJavaScript関数を作成する必要があります。この関数は、直前の要素に対して +1 となっていない(連続していない)最初の要素を返さなければなりません。 言い換えると、隣り合う要素同士の差が1以外になる箇所が現れたとき、その箇所の後ろ側の要素を返すという処理です。なお、そのような要素が必ず配列内に1つ以上存在するものとします。 サンプルコード以下は、実

  2. C++で配列内に偶数回出現する最初の要素を見つけるプログラム

    この問題では、N個の整数値からなる配列 arr[] が与えられます。私たちのタスクは、配列内で偶数回出現する最初の要素を見つけるプログラムを作成することです。条件を満たす要素が存在する場合はその要素を返し、存在しない場合は false を表す -1 を返します。問題を理解するための例入力: arr[] = {2, 3, 7, 2, 3, 6, 4, 1, 2} 出力: 3この例では、要素「2」は3回、「3」は2回出現しています。したがって、偶数回(2回)出現する最初の要素は「3」となり、これが出力となります。解決アプローチこの問題を解く最もシンプルな方法は、配列の各要素を1つずつ取り上げて、そ