Set の基本 — new Set(arr)
JavaScript の Set は「重複を許さない値の集合」を扱うための組み込みオブジェクトです。配列と似ていますが、同じ値を二度入れることはできません。順序は追加した順に保持されます。
基本の使い方
// 配列からSetを作成
const s = new Set([1, 2, 3, 3, 2]);
console.log(s); // Set(3) { 1, 2, 3 }
console.log(s.size); // 3(重複は自動的に除外)
JavaScript- new Set(iterable): 配列や文字列など反復可能なものから集合を作る。
- size: 要素数を返す(配列の length に相当)。
よく使うメソッド
- add(value): 値を追加(重複は無視)
- delete(value): 値を削除
- has(value): 値が含まれているか判定
- clear(): 全削除
- for…of / forEach: 繰り返し処理
const s = new Set();
s.add("apple");
s.add("banana");
s.add("apple"); // 重複は無視
console.log(s.has("apple")); // true
s.delete("banana");
console.log(s.size); // 1
JavaScriptすぐ使えるテンプレート集
1) 配列の重複を除去
const arr = [1, 2, 2, 3, 3, 3];
const unique = [...new Set(arr)];
console.log(unique); // [1, 2, 3]
JavaScript2) 集合演算(和集合・積集合・差集合)
const a = new Set([1, 2, 3]);
const b = new Set([3, 4]);
// 和集合
const union = new Set([...a, ...b]); // {1,2,3,4}
// 積集合
const intersection = new Set([...a].filter(x => b.has(x))); // {3}
// 差集合
const difference = new Set([...a].filter(x => !b.has(x))); // {1,2}
JavaScript3) 文字列のユニーク文字を抽出
const str = "banana";
const chars = [...new Set(str)];
console.log(chars); // ["b","a","n"]
JavaScript4) 繰り返し処理
const s = new Set(["red", "blue", "green"]);
for (const color of s) {
console.log(color);
}
JavaScript実務で便利なパターン
- 重複排除: ユーザー入力やリストからユニーク値を抽出。
- 高速検索:
hasは O(1) で判定できるため、配列より効率的。 - 集合演算: タグや権限の比較に便利。
// ユーザー権限の比較
const userRoles = new Set(["read", "write"]);
const required = new Set(["read", "admin"]);
const hasAll = [...required].every(r => userRoles.has(r));
console.log(hasAll); // false
JavaScriptよくある落とし穴と対策
- 順序は保持されるがインデックスアクセス不可:
s[0]は使えない。
→ 対策:[...s][0]のように配列に展開してアクセス。 - オブジェクトは参照で判定:
{x:1}と{x:1}は別物。
→ 対策: 同じ参照を使うか、キー化して比較。 - JSON化できない:
JSON.stringify(new Set([1,2]))は{}。
→ 対策:[...s]で配列に変換してから。
練習問題(手を動かして覚える)
// 1) 配列の重複を除去
const arr = ["apple","banana","apple","orange"];
console.log([...new Set(arr)]); // ["apple","banana","orange"]
// 2) 和集合・積集合・差集合
const A = new Set([1,2,3]);
const B = new Set([2,3,4]);
console.log(new Set([...A,...B])); // 和集合 {1,2,3,4}
console.log(new Set([...A].filter(x=>B.has(x)))); // 積集合 {2,3}
console.log(new Set([...A].filter(x=>!B.has(x)))); // 差集合 {1}
// 3) 文字列からユニーク文字
console.log([...new Set("hello")]); // ["h","e","l","o"]
JavaScript直感的な指針
- 重複を消したい:
new Set(arr)→[...new Set(arr)] - 存在チェック:
s.has(value)は高速。 - 集合演算: スプレッド+filterで簡単に。
- 配列に戻す:
[...s]で展開。
