Setとは?
Setオブジェクトは集合です。
重複する値は入れられないという特徴があります。
また、Setは[Symbol.iterator]メソッドを持つため反復可能(Iterable)です。
使い方
Setオブジェクトはコンストラクタから作成できます。
const set = new Set()
第一引数に配列(反復可能オブジェクト)を入れることで、Setの初期値を設定することもできます。
const array = [1, 4, 5]
const set = new Set(array)
配列の要素を一意にする
Setは要素の重複を許しません。
そのため、本来の使い方ではなさそうですが、配列の要素から重複を削除する目的でも使えます。
例えばこんな感じです。
// 重複を削除したい配列
const array = [1, 2, 2, 5, 6 ,6];
const set = new Set(array);
[...set]; // [1, 2, 5, 6]
これは、Setが以下の特徴を持っているからできます。
- コンストラクタが反復可能オブジェクトを取る
-
Setが重複を許さない -
Set自身が反復可能なので、スプレッド構文で配列に変換できる
よく使うメソッド
Setオブジェクトはいくつかのメソッドを持っています。
ここでは、その中でも個人的によく使うものを紹介します。
add
与えられた要素を追加します。
const set = new Set()
set.add(1)
set.add(3)
set // Set(2) {1, 3}
なお、その要素がすでにSetオブジェクト内にあった場合、要素は追加されません。
const set = new Set()
set.add(3)
set.add(3) // すでに追加した要素を追加
set // Set(1) {3}
has
与えられた要素がSet内に存在するかどうかを返します。
戻り値はbooleanです。
const set = new Set([1, 5])
set.has(1) // true
set.has(2) // false
set.add(2)
set.has(2) // true
size
メソッドではなくプロパティですが、ここで紹介します。
Setの要素数を示すプロパティです。
const set = new Set([1, 5, 6])
set.size // 3
set.add(2) // 要素を追加
set.size // 4
delete
与えられた要素をSetから削除します。
const set = new Set([1, 2, 3])
set.has(1) // true
set.delete(1) // 1を削除
set.has(1) // false
set.delete(3) // 3を削除
set // Set(1) {2}
clear
Setから全ての要素を削除します。
const set = new Set([1, 3, 5])
set.size // 3
set.clear()
set.size // 0
forEach
各要素を使ってループします。
与えられた関数(callbackFn)を全ての要素に対して適用するとも言います。
callbackFnは以下の引数で呼び出されます。
-
element: 要素 -
index: 要素のインデックス -
set:forEachが呼び出されているSetオブジェクト自身
const set = new Set([1, 2, 2, 3, 1, 4])
set // Set(4) {1, 2, 3, 4]
set.forEach(num => {
console.log(`number: ${num}`)
})
// number: 1
// number: 2
// number: 3
// number: 4
集合として扱う
つい最近(2024年)、ECMAScriptにSetオブジェクトの和集合や差集合を計算するメソッドが追加されました。
例えば和集合(2つの集合を足す)は、unionメソッドで計算できます。
const set1 = new Set([1, 3, 5])
const set2 = new Set([2, 4])
const set3 = set1.union(set2) // 和集合を計算
set3 // Set(5) {1, 3, 5, 2, 4}
他にも以下のようなメソッドがあります。
-
union: 和集合 -
difference: 差集合 -
intersection: 交差 - etc...
詳細はMDNをご覧ください。