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. ブラウザツールでテキストリストの重複を消す

コードを書かずにテキスト一覧の重複行を消したい場合は下記ツールを使用してください。

🧹 この場で重複を削除する