Set<T>
Set
はJavaScriptの組み込みAPIのひとつで、値のコレクションを扱うためのオブジェクトです。Set
には重複する値が格納できません。Set
に格納された値は一意(unique)になります。
Setオブジェクトの作り方
Set
オブジェクトを新たに作るには、Set
クラスをnew
します。コンストラクタに配列を渡すと、値がSet
に格納されます。
ts
constfruits = newSet (["apple", "orange", "banana"]);console .log (fruits );
ts
constfruits = newSet (["apple", "orange", "banana"]);console .log (fruits );
コンストラクタに渡す配列の中に重複がある場合、重複した値は取り除かれます。
ts
constfruits = newSet (["apple", "apple", "apple"]);console .log (fruits );
ts
constfruits = newSet (["apple", "apple", "apple"]);console .log (fruits );
コンストラクタ引数を省略した場合、空のSet
オブジェクトが作られます。
ts
constfruits = newSet ();console .log (fruits );
ts
constfruits = newSet ();console .log (fruits );
空のSet
オブジェクトのTypeScript上の型はSet<unknown>
になります。これでは後からSet
に値を追加できないので、空のSet
を作るときは、Set
の型変数を指定する必要があります。
ts
const fruits = new Set<string>();// ^^^^^^^^ 型変数を指定
ts
const fruits = new Set<string>();// ^^^^^^^^ 型変数を指定
Setの型注釈
TypeScriptでSet
の型注釈をする場合は、Set<string>
のようにSet要素の型を型変数に指定します。
ts
functiondoSomething (strings :Set <string>) {// ...}
ts
functiondoSomething (strings :Set <string>) {// ...}
Setの操作
値を追加する - Set.prototype.add()
Set
に値を追加するにはadd
メソッドを用います。同じ値は何度追加しても増えないようになっています。
ts
constfruits = newSet <string>();fruits .add ("apple");fruits .add ("apple");console .log (fruits );
ts
constfruits = newSet <string>();fruits .add ("apple");fruits .add ("apple");console .log (fruits );
追加した値は最後に足されます。すでに存在する値は、追加されず順番は変わりません。
ts
constnumbers = newSet <number>();numbers .add (1).add (2).add (3);numbers .add (1);console .log (numbers );
ts
constnumbers = newSet <number>();numbers .add (1).add (2).add (3);numbers .add (1);console .log (numbers );
値を削除する - Set.prototype.delete()
Set
から値を取り除くには、delete
メソッドを使います。
ts
constnumbers = newSet ([1, 2, 3]);numbers .delete (3);console .log (numbers );
ts
constnumbers = newSet ([1, 2, 3]);numbers .delete (3);console .log (numbers );
値の有無を確認する - Set.prototype.has()
Set
に値が存在するかどうかはhas
メソッドで調べられます。
ts
constnumbers = newSet ([1, 2, 3]);console .log (numbers .has (1));console .log (numbers .has (999));
ts
constnumbers = newSet ([1, 2, 3]);console .log (numbers .has (1));console .log (numbers .has (999));
値の個数を取得する - Set.prototype.size()
Set
にいくつ値が登録されているかを調べるには、size
フィールドの値を見ます。
ts
constfruits = newSet (["apple", "orange", "banana"]);console .log (fruits .size );
ts
constfruits = newSet (["apple", "orange", "banana"]);console .log (fruits .size );
Setを空っぽにする - Set.prototype.clear()
Set
に登録された値をすべて削除するにはclear
メソッドを使います。
ts
constfruits = newSet (["apple", "orange", "banana"]);fruits .clear ();console .log (fruits );
ts
constfruits = newSet (["apple", "orange", "banana"]);fruits .clear ();console .log (fruits );
Setをループする
Set
オブジェクトはfor-of構文でループできます。
ts
constfruits = newSet (["apple", "orange", "banana"]);for (constfruit offruits ) {console .log (fruit ); // "apple"、"orange"、"banana"の順で出力される}
ts
constfruits = newSet (["apple", "orange", "banana"]);for (constfruit offruits ) {console .log (fruit ); // "apple"、"orange"、"banana"の順で出力される}
📄️ for-of文 - 拡張for文
JavaScriptで配列をループするのに使えるのがfor-of構文です。PHPのforeachやPythonのfor inと使い勝手が似ている構文です。
Setを配列に変換する
Set
オブジェクトを配列に変換するには、スプレッド構文を用います。
ts
constfruits = newSet (["apple", "orange", "banana"]);constarray = [...fruits ];console .log (array );
ts
constfruits = newSet (["apple", "orange", "banana"]);constarray = [...fruits ];console .log (array );
📄️ 配列のスプレッド構文「...」
JavaScript の配列ではスプレッド構文「...」を使うことで、要素を展開することができます。
Setは直接JSONにできない
Set
オブジェクトはJSON.stringify
にかけても、Set
に登録されている値はJSONになりません。
ts
constfruits = newSet (["apple", "orange", "banana"]);console .log (JSON .stringify (fruits ));
ts
constfruits = newSet (["apple", "orange", "banana"]);console .log (JSON .stringify (fruits ));
SetオブジェクトのデータをJSON化したい場合は、一度配列にするなどひと手間必要です。
ts
constfruits = newSet (["apple", "orange", "banana"]);constarray = [...fruits ];console .log (JSON .stringify (array ));
ts
constfruits = newSet (["apple", "orange", "banana"]);constarray = [...fruits ];console .log (JSON .stringify (array ));
レシピ
配列から重複要素を取り除く
「Set
に渡した値は重複しない」という特性を使って、配列から値が重複する要素を取り除く処理に応用できます。
js
constarray1 = [0, 0, 1, 1, 2, 2];constarray2 = [...newSet (array1 )];console .log (array2 );
js
constarray1 = [0, 0, 1, 1, 2, 2];constarray2 = [...newSet (array1 )];console .log (array2 );