JavaScriptで配列の重複を削除する最速コード(Set / Map / filter)
JavaScript プログラミング アルゴリズム
JavaScriptで配列(Array)から重複する要素を排除・一意化する手法まとめです。
1. プリミティブ値(数値・文字列)の重複削除
① Set を使う(最速・推奨)
ES6の Set は重複する値を保持しない性質を持ちます。スプレッド演算子 [...] と合わせることで1行で書けます。
const numbers = [1, 2, 2, 3, 1, 4];
const uniqueNumbers = [...new Set(numbers)];
console.log(uniqueNumbers); // [1, 2, 3, 4]
② Array.from(new Set(...))
明示的に Array.from を使用する方法です。動作・パフォーマンスはスプレッド構文と同等です。
const uniqueNumbers = Array.from(new Set(numbers));
2. オブジェクト配列の重複削除
オブジェクト配列の場合、Set は参照比較(リファレンス一致)になるため、中身が同じプロパティでも削除されません。
① Map を使う(プロパティ指定・推奨)
一意にしたいプロパティ(例: id)をキーにして Map に放り込むことで、後勝ちで重複が除外されます。
const users = [
{ id: 1, name: "Alice" },
{ id: 2, name: "Bob" },
{ id: 1, name: "Alice" },
];
const uniqueUsers = Array.from(
new Map(users.map(user => [user.id, user])).values()
);
console.log(uniqueUsers);
// [{ id: 1, name: "Alice" }, { id: 2, name: "Bob" }]
② filter + findIndex を使う
ネストされた複雑な条件で判定したい場合に適しています。
const uniqueUsers = users.filter((user, index, self) =>
index === self.findIndex(t => t.id === user.id && t.name === user.name)
);
3. パフォーマンスと計算量(Big-O)
| 手法 | 時間計算量 | 特徴 |
|---|---|---|
Set | $O(n)$ | 内部ハッシュ検索のため大量データ(10万件〜)でも非常に高速 |
Map (オブジェクト) | $O(n)$ | プロパティ単位の重複判定で最速 |
filter + indexOf | $O(n^2)$ | 配列長ごとに線形検索するため、データ量が増えると著しく低速化する(非推奨) |
4. ブラウザツールでテキストリストの重複を消す
コードを書かずにテキスト一覧の重複行を消したい場合は下記ツールを使用してください。