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

【JavaScript】配列内の各要素の出現回数をn回までに制限する方法

問題の概要

JavaScriptで次のような関数を作成します。この関数は、重複を含む可能性のある整数の配列 arr を第1引数として受け取り、数値 num を第2引数として受け取ります。

関数の役割は、配列を走査して、特定の数値が配列内に num 回よりも多く出現していないかどうかを確認することです。

もしそのような要素が存在する場合、余分な出現箇所を削除し、各要素の出現回数を最大でも num 回に制限します。

例えば、関数への入力が以下の場合を考えてみましょう。

入力:

const arr = [4, 1, 3, 1, 4, 1, 3, 4, 2];
const num = 2;

出力:

const output = [4, 1, 3, 1, 4, 3, 2];

出力の解説:

この例では、41 の両方が3回ずつ出現しているため、3回目の出現が削除され、それぞれ2回までに制限されています。

実装コード

以下がそのコード例です。

const arr = [4, 1, 3, 1, 4, 1, 3, 4, 2];
const num = 2;
const deleteExtra = (arr = [], num = 1) => {
    if(num === 0){
        return [];
    };
    const res = [];
    const map = {};
    for(let i = 0; i < arr.length; i++){
        const el = arr[i];
        map[el] = (map[el] || 0) + 1;
        if(map[el] <= num){
            res.push(el);
        };
    };
    return res;
};
console.log(deleteExtra(arr, num));

出力:

[ 4, 1, 3, 1, 4, 3, 2 ]

コードの解説

このアプローチのポイントは以下の通りです。

  • num が 0 の場合、どの要素も出現が許されないため、即座に空の配列を返します。
  • オブジェクト map をハッシュマップとして使い、各要素がこれまでに何回出現したかを記録します。
  • 配列をたった1回のループで処理するため、時間計算量は O(n) と非常に効率的です。
  • 各要素についてカウントを更新し、その値が num 以下である場合のみ結果配列に追加します。これにより、先頭側の出現は優先的に残り、余分な出現だけが除外されます。
  • 元の配列の順序はそのまま維持されるため、出力結果も入力の並び順を保ちます。

この手法は、ログデータの整理やリストの正規化など、重複データを一定件数に抑えたい場面で幅広く活用できます。

  1. JavaScript DOMとは?基本の仕組みと要素の取得方法をわかりやすく解説

    JavaScriptのDOM(Document Object Model:ドキュメントオブジェクトモデル)は、Webページ上のHTML要素を表現する仕組みです。DOMはインターフェースとして機能し、ページのコンテンツやスタイルを変更することで、Webページを自由に操作できるようにします。 DOMにアクセスするには、Webページ上で右クリックして「検証(Inspect)」を選択します。すると画面の右側または左側にパネルが表示され、現在閲覧しているページのHTML要素を確認できます。要素にマウスカーソルを合わせると、ページ上の該当部分がハイライトされるため、どの要素がページのどのセクションに対応

  2. JavaScriptでキューに要素を追加する(エンキュー)方法

    キューへの要素追加(エンキュー)とは キューに要素を追加すること(エンキュー)とは、コンテナ配列の末尾に新しい要素を加える操作です。本記事では、配列の末尾をキューの「尾部(tail)」として扱い、すべての挿入操作をこの末尾に対して行います。つまり、先入れ先出し(FIFO)の構造において、新しく入ってくる要素は常に列の最後尾へ並ぶことになります。 この考え方に基づけば、enqueue 関数は次のようにシンプルに実装できます。 実装例:enqueue関数 enqueue(element) { // キューが満杯かどうかをチェック if (this.isFull()) {