JavaScriptでオブジェクト配列から重複を削除する最適な方法(Set活用)
JavaScriptでオブジェクトの配列を扱っていると、同じ値を持つ要素が重複して含まれるケースによく遭遇します。本記事では、Set の概念を活用して、オブジェクト配列から重複を効率的に取り除く方法を解説します。
重複を含むオブジェクト配列の例
まず、次のような重複データを含むオブジェクト配列を用意します。
var studentDetails = [
{ studentId: 101 },
{ studentId: 104 },
{ studentId: 106 },
{ studentId: 104 },
{ studentId: 110 },
{ studentId: 106 },
]この配列には studentId: 104 と studentId: 106 がそれぞれ2回登場しています。ここから重複を排除し、一意な要素だけを持つ新しい配列を作成しましょう。
Setを使った重複削除の実装方法
Setは「同じ値を1つしか保持できない」という特性を持つため、重複チェックに最適です。以下の手順で処理を行います。
- これまで確認した
studentIdを記録するためのSetを生成する - 配列の各オブジェクトを順番に走査する
- その
studentIdがSetに存在しない場合のみ、Setに追加しつつ結果配列へpushする
実際のコードは次の通りです。
サンプルコード
var studentDetails = [
{ studentId: 101 },
{ studentId: 104 },
{ studentId: 106 },
{ studentId: 104 },
{ studentId: 110 },
{ studentId: 106 },
]
// 既出のstudentIdを記録するSet
const distinctValues = new Set();
// 重複なしの結果を格納する配列
const withoutDuplicate = [];
for (const tempObj of studentDetails) {
if (!distinctValues.has(tempObj.studentId)) {
distinctValues.add(tempObj.studentId);
withoutDuplicate.push(tempObj);
}
}
console.log(withoutDuplicate);distinctValues.has() による存在確認により、すでに処理済みのIDを持つオブジェクトは自動的にスキップされます。
プログラムの実行方法
Node.js環境で上記のプログラムを実行するには、以下のコマンドを使用します。
node fileName.js
実行結果
ここではファイル名を demo158.js として保存しています。実行すると、次の出力が得られます。
PS C:\Users\Amit\JavaScript-code> node demo158.js
[
{ studentId: 101 },
{ studentId: 104 },
{ studentId: 106 },
{ studentId: 110 }
]ご覧の通り、重複していた 104 と 106 がそれぞれ1件だけ残り、一意な4件のオブジェクトだけが出力されました。
この手法のポイント
- 計算量: Setの
has()メソッドは高速な検索を提供するため、大規模な配列でもパフォーマンスよく動作します。 - 元の配列を保持: 元の
studentDetails配列は変更されず、結果は新しい配列に格納されます。 - 柔軟性: 比較対象のプロパティを変えれば、
studentId以外のキーでも同様に重複削除が可能です。
オブジェクトそのものではなく特定のプロパティを基準に重複を判断したい場合、このSetを使ったアプローチが最もシンプルかつ確実な解決策となります。ぜひ実際の開発で活用してみてください。
-
JavaScriptでネストされた配列から最も短いサブ配列を取得する方法
はじめに例えば、次のようなネストされた配列(配列の中に複数の配列が格納されている構造)があるとします。const arr = [ ["LEFT", "RIGHT", "RIGHT", "BOTTOM", "TOP"], ["RIGHT", "LEFT", "TOP"], ["TOP&q
-
【JavaScript】配列から指定した数値を削除し、残りの要素を左にシフトする方法
今回は、数値の配列を第1引数に、削除したい数値を第2引数に受け取るJavaScript関数を作成します。この関数は、第2引数で指定された数値が配列内に存在する場合、その要素を取り除き、それより右側にあるすべての要素を1つずつ左へシフトする必要があります。唯一の条件は、slice() や splice() をはじめとする配列操作系の組み込みメソッドを使用してはいけないという点です。また、同じ数値が配列内に複数存在する場合は、最初に出現したものだけを削除します。処理内容の例たとえば、入力配列が次のような場合を考えてみましょう。const arr = [3, 5, 6, 3, 7, 8, 8, 6]