【JavaScript超入門】Set と filter で配列の重複を取り除く方法

javascript

初めに

JavaScript で配列を扱っていると、重複要素を取り除いて「ユニーク」な配列を得たい場面がたびたびあります。
たとえば、タグ一覧の整理フォーム入力値の精査API レスポンスの前処理などです。
本記事では元の並び順を保ちながら重複を除去する関数 removeDuplicates() を実装し、その考え方を初心者の方にもわかりやすく解説します。

問題文

数値または文字列の配列 arr を受け取り、重複を除去した新しい配列を返す関数 removeDuplicates(arr) を作成してください。
ポイントは元の順番を壊さないことです。

// 期待される実行例
console.log(removeDuplicates([1, 2, 2, 2, 3, 8, 9, 7, 4, 1]));
// 出力 → [1, 2, 3, 8, 9, 7, 4]

必要な関数・構文(かんたん例付き)

構文・メソッド用途ミニ例
Set 重複しないコレクションを作る new Set([1,1,2]) // → Set {1,2}
Array.prototype.filter() 条件を満たす要素だけ抜き出す [1,2,3].filter(n => n > 1) // → [2,3]
スプレッド構文 ... 配列や Set を展開してコピー [...new Set([1,1,2])] // → [1,2]

解くためのヒント・考え方

  1. 重複検知Set を活用する。Set は同じ値を 2 度格納しません。
  2. filter() で配列を頭から走査し、
     まだ出現していない要素だけ結果に残す。
  3. この時、sort() を使わないことで順序を保持できます。

正解コード

/**
 * 配列から重複要素を取り除き、元の順序を保った新しい配列を返す
 * @param {Array<number|string>} arr
 * @returns {Array<number|string>}
 */
function removeDuplicates(arr) {
  const seen = new Set();        // すでに出現した値を記録
  return arr.filter(item => {
    if (seen.has(item)) return false; // 2回目以降はスキップ
    seen.add(item);                   // 初出なら記録して残す
    return true;
  });
}

// 動作確認
console.log(removeDuplicates([1, 2, 2, 2, 3, 8, 9, 7, 4, 1]));
// → [1, 2, 3, 8, 9, 7, 4]

よくある誤り:[...new Set(arr)].sort() では順序が変わる

Set だけでユニーク化し、sort() で並べ替えると順序基準が辞書順/数値順に置き換わります。
そのため元の順序を保つ要件を満たせません。filter パターンを覚えましょう。

まとめ + 将来どういった場面で応用が効くか

  • filter × Set で「重複排除 & 順序保持」をシンプルに実装できました。
  • タグリスト、カテゴリ一覧、入力バリデーションなどのフロントエンド前処理で大活躍。
  • さらに発展させて、オブジェクト配列から特定キーだけ抜き出してユニーク化する場合も同じ考え方で応用できます。

ぜひ日々の開発に組み込んで、コードをもっとクリーンに保ちましょう!

// 動作確認 console.log(removeDuplicates([1, 2, 2, 2, 3, 8, 9, 7, 4, 1])); // ⇒ [1, 2, 3, 8, 9, 7, 4]

まとめ + 将来の応用シーン

  • 本記事では、配列内の重複を取り除きつつ元の順序を保つ方法として、filterSetの組み合わせを解説しました。
  • ユニークデータの取得は、タグ一覧の整理、フォーム入力チェック、APIから取得したリストの重複排除 など、さまざまな場面で役立ちます。
  • さらに発展させると、オブジェクトの配列から特定キーでユニークを取るロジックにも応用可能です。

ぜひ今回のロジックを日々のJavaScript開発に活用してみてください!

コメント

タイトルとURLをコピーしました