JavaScriptで配列内の重複している数値をすべて検索する方法
JavaScriptでは、同じ要素が何度も含まれている数値の配列を扱うことがあります。この記事では、そのような配列の中から2回以上出現するすべての要素を抽出し、新しい配列として返す関数を作成します。
問題の定義
作成する関数は、数値の配列を引数として受け取り、その中で1回より多く出現している要素だけを集めた配列を返すものです。
例:
入力となる配列が次の場合、
const arr = [1, 3, 4, 3, 5, 4, 6, 8, 8];
期待される出力は次のようになります。
const output = [3, 4, 8];
この例では、「3」「4」「8」がそれぞれ複数回登場しているため、これらが結果の配列に含まれます。各重複要素は結果に一度だけ含まれる点に注意してください。
実装のアプローチ
最もシンプルで効率的な方法は、ハッシュマップ(オブジェクト)を使って各要素の出現回数を記録することです。
- 空のオブジェクトと結果用の配列を用意します。
- 配列を順番に走査し、各要素の出現回数をカウントします。
- ある要素の出現回数がちょうど「2回目」になったタイミングで、その値を結果の配列に追加します。
- こうすることで、3回以上出現する要素があっても、結果には1度だけ記録されます。
コード例
以下が実際のコードです。
const arr = [1, 3, 4, 3, 5, 4, 6, 8, 8];
const findDuplicates = (arr = []) => {
let map = {};
let res = [];
for(let i = 0; i < arr.length; i++) {
if(map[arr[i]]) {
if(map[arr[i]] === 1) {
res.push(arr[i]);
}
map[arr[i]] = map[arr[i]] + 1;
} else {
map[arr[i]] = 1;
};
};
return res;
};
console.log(findDuplicates(arr));処理の流れを解説
- map:各数値が何回出現したかを記録するためのオブジェクトです。
- res:重複が確認された数値を格納する結果の配列です。
- ループ内では、まず
map[arr[i]]の存在をチェックし、存在しなければ1を設定します。 - 既に存在していてその値が
1(=2回目の出現)であれば、resに追加します。 - その後、カウントを増やしていきます。値が
2以上になった場合は追加済みなので、再度追加されることはありません。
出力結果
コンソールには以下のように出力されます。
[3, 4, 8]
計算量について
このアルゴリズムは配列を一度だけ走査するため、時間計算量は O(n) です。また、出現回数の記録に使用するマップの分だけメモリを使用するため、空間計算量も O(n) となります。大規模な配列でも高速かつ安定して動作する効率的な手法と言えます。
-
JavaScriptで配列の要素を同じ配列内に複製する方法
JavaScriptでは、concat()メソッドとsort()メソッドを組み合わせることで、既存の配列の要素を同じ配列内に複製することができます。ここでは、実際に動作するサンプルコードを使って、その手順をわかりやすく解説します。 コード例 以下は、配列の要素を同じ配列内に複製するためのコード例です。 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <meta name="viewport" cont
-
JavaScriptで配列内のすべてのピーク(局所最大値)とその位置を検出する方法
データ分析や信号処理の現場では、数値の配列の中から「山」にあたる部分、つまり局所最大値(ピーク)とその位置を特定したい場面がよくあります。本記事では、JavaScriptを使って配列内のすべてのピークと、そのインデックス位置を効率的に検出する方法を解説します。 前提となる例 まず、次のようなJavaScriptの配列を用意します。 const arr = [4, 3, 4, 7, 5, 2, 3, 4, 3, 2, 3, 4]; この配列の各要素をY軸の値としてプロットし、隣り合う要素同士をX軸上で等間隔(単位距離)に配置すると、グラフは以下のようになります。 グラフを見ると分かるように、こ