君はJavaScriptのSetを知っているか?Setの使い方・基本文法まとめ
こんにちは、AIQ株式会社のフロントエンドエンジニアのまさぴょんです!
今回は、JavaScriptのSetとは何か、Setの使い方についてまとめて解説します。
JavaScriptのMap
に関しては、こちらの記事で解説しています。
JavaScriptのSetとは何か?
Set
は、コレクション・タイプの1つで、keyなしの値(value)の集合です。
Set
には次のような特徴があります。
-
Set
内の値(value)は、必ず一意になる- 同じ値を追加しようとしても、追加されない。
-
Set
にはkey
がないため、value
を取り出す際には、工夫が必要です。-
Array.from()
で配列に変換して、取り出す。 -
Set
のforEach()
や、for of
などの繰り返し処理で取り出す。
-
-
Set
の一意性チェックを高速に行うよう、内部的に最適化されている。 -
Set
はその要素について挿入順で反復処理を行うことができます。- 挿入順は、
add
メソッドによってSet
に挿入された順番に対応します。
- 挿入順は、
活用例:配列の重複する要素・値を削除するためにSetを使用する
活用事例(ユースケース)として、JavaScriptで配列の重複する要素・値を削除するには、Set
を使用します。
const cardList = [
{id: 1, participant: 'ロボたま', affiliation: 'エンジニア'},
{id: 2, participant: 'まりたま', affiliation: 'エンジニア'},
{id: 3, participant: '白桃', affiliation: '営業部'},
{id: 4, participant: 'ももちゃん', affiliation: '営業部'},
{id: 5, participant: 'まさぴょん', affiliation: '営業部'},
{id: 6, participant: 'まりぴょん', affiliation: 'デザイナー'},
{id: 7, participant: 'ハム太郎', affiliation: 'エンジニア'},
{id: 8, participant: 'ロボ太郎', affiliation: 'デザイナー'},
{id: 9, participant: 'まり太郎', affiliation: 'デザイナー'},
{id: 10, participant: 'ぷる玉', affiliation: '人事部'},
{id: 11, participant: 'ぷるぷる玉', affiliation: '人事部'},
{id: 12, participant: 'ロボ玉試作1号機', affiliation: 'エンジニア'},
{id: 13, participant: 'ロボ玉試作2号機', affiliation: 'デザイナー'},
{id: 14, participant: 'ロボ玉試作1号機', affiliation: 'ロボ玉開発部'},
];
// 部署・情報だけの配列
const affiliationList = cardList.map(card => card.affiliation);
console.log('affiliationList', affiliationList);
// 1. 配列の重複を削除する処理 Ver. Array.form
const uniqueAffiliList = Array.from(new Set(affiliationList));
console.log('uniqueAffiliList', uniqueAffiliList);
// ['エンジニア', '営業部', 'デザイナー', '人事部', 'ロボ玉開発部']
// 2. 配列の重複を削除する処理 Ver. スプレッド構文
const uniqueAffiliList2 = [...new Set(affiliationList)];
console.log('uniqueAffiliList2', uniqueAffiliList2);
// ['エンジニア', '営業部', 'デザイナー', '人事部', 'ロボ玉開発部']
上記のSampleCodeは、私の個人ブログで、以前にご紹介した内容になります。
Setの使い方・基本文法
ここからは、Set
の使い方・基本文法について解説していきます。
Set
の主なメソッドは次の通りです。
Mapの主なメソッド
-
const set = new Set();
– 新しいset
インスタンスを作ります。 -
set.add(value)
–value
を追加し、set
自身を返します。 -
set.has(value)
–value
が存在する場合にtrue
を返します。そうでなければfalse
になります。 -
set.delete(value)
–value
を削除します。-
value
が呼び出し時に存在すればtrue
, そうでなければfalse
を返します。
-
-
set.clear()
–set
をクリア(中身のvalue
をすべて削除)します。 -
set.size
– 現在のset
インスタンスの要素の数です。 -
set.forEach()
ーset
インスタンスからvalue
を1つずつ取り出す。
Setの新規作成(初期インスタンスの作成)
Set
を新規作成する場合は、new Set()
の形で、Set
インスタンスを作成します。
また配列の形で 初期値を渡すことができます。
/** Setコレクションのインスタンスを生成する */
const set1 = new Set();
console.log('set1', set1); // set1 Set(0) {size: 0}
/** 3つの初期Dataがセットされている Set・インスタンス */
const set2 = new Set(["One", "Two", "Three"]);
console.log('set2', set2); // set2 Set(3) {'One', 'Two', 'Three'}
Setの長さ・sizeを測る
set.size
で、Set
の要素数・長さ(size)を測ることができます。
const set1 = new Set();
const set2 = new Set(["One", "Two", "Three"]);
// set.sizeで、Setの要素数・長さを測ります
console.log(set1.size); // 0
console.log(set2.size); // 3
Setに値(value)を追加する
set.add(value)
の形で、Set
に値(value)を追加することができます。
また、Set
内の値(value)は、必ず一意になる特性があるため、add
メソッドで同じ値を追加しようとしても、追加されないという挙動があります。
const set1 = new Set();
// Set に value を追加する
set1.add(1).add(2).add(3)
set1.add(5).add(12)
// 同じ値を追加しようとしても、追加されない
set1.add(1).add(2)
console.log('set1', set1); // Set(5) {1, 2, 3, 5, 12}
Setの値(value)の存在確認をする
set.has(value)
で、value
が存在するかどうかの確認ができます。
value
が存在する場合にtrue
を返し、そうでなければfalse
を返します。
const set1 = new Set([1,2,3,5,12]);
const isHas1 = set1.has(1)
const isHas8 = set1.has(8)
console.log('isHas1', isHas1); // isHas1 true
console.log('isHas8', isHas8); // isHas8 false
Setにセットしたvalueを削除する
set.delete(value)
で、value
を削除します。
const set1 = new Set([1,2,3,5,12]);
console.log('set1', set1); // set1 Set(5) {1, 2, 3, 5, 12}
// Setから要素を削除する
set1.delete(1);
set1.delete(5)
console.log('set1', set1); // set1 Set(3) {2, 3, 12}
Setの中身をClear(すべて削除)する
set.clear()
で、set
をクリア(中身のvalue
をすべて削除)します。
const set1 = new Set([1,2,3,5,12]);
console.log('set1', set1); // set1 Set(5) {1, 2, 3, 5, 12}
// Setのすべての要素を削除
set1.clear();
console.log('set1', set1); // set1 Set(0) {size: 0}
Setの値(value)を取得する方法
Setの値(value)を取得する方法には、主に次の3つがあります。
-
set.forEach()
で、set
インスタンスからvalue
を1つずつ取り出す。 -
for of
文で、value
を1つずつ取り出す。 -
Array.from()
で、Set
を配列に変換して、value
を取り出す。
Setした値を取り出すSet.forEach(繰り返し処理)
set.forEach()
で、set
インスタンスからvalue
を1つずつ取り出すことができます。
const userSet = new Set()
const robotama = { name: "ロボ玉" };
const momo = { name: "ももちゃん" };
const hakutou = { name: "白桃" };
userSet.add(robotama).add(momo).add(hakutou)
console.log('userSet', userSet);
userSet.forEach((value, valueAgain, set) => {
console.log(value);
console.log(valueAgain);
console.log(set);
});
for of文でvalueを取り出す
for of
文は、イテレーターならvalue
を1つずつ取り出すことができます。
const userSet = new Set()
const robotama = { name: "ロボ玉" };
const momo = { name: "ももちゃん" };
const hakutou = { name: "白桃" };
userSet.add(robotama).add(momo).add(hakutou)
console.log('userSet', userSet);
// for of で value を取り出す
for (const user of userSet) {
console.log(user.name);
}
Array.from()で配列に変換して、取り出す。
Array.from()
で、Set
を配列に変換して、value
を取り出す方法も有効な手段です。
const userSet = new Set()
const robotama = { name: "ロボ玉" };
const momo = { name: "ももちゃん" };
const hakutou = { name: "白桃" };
userSet.add(robotama).add(momo).add(hakutou)
console.log('userSet', userSet); // userSet Set(3) {{…}, {…}, {…}}
console.log('userSet[0]', userSet[0]); // userSet[0] undefined
const arrayUserSet = Array.from(userSet)
console.log('arrayUserSet', arrayUserSet); // arrayUserSet (3) [{…}, {…}, {…}]
console.log('arrayUserSet[0]', arrayUserSet[0]); // arrayUserSet[0] {name: 'ロボ玉'}
番外編:values, keys, entriesメソッドたち
Map
との互換性のために、Map
がイテレーションのために持っているメソッドと同じメソッドをSet
もサポートしています。
const userSet = new Set()
const robotama = { name: "ロボ玉" };
const momo = { name: "ももちゃん" };
const hakutou = { name: "白桃" };
// Mapと同じく、values, keys, entries もメソッドとして、存在する
const values = userSet.values()
console.log('values', values);
const keys = userSet.keys()
console.log('keys', keys);
const entries = userSet.entries()
console.log('entries', entries);
まとめ
Set
の特徴である一意性のあるデータのコレクションが必要な際に、ぜひSet
を活用してみてください。
個人で、Blogもやっています、よかったら見てみてください。
注意事項
この記事は、AIQ 株式会社の社員による個人の見解であり、所属する組織の公式見解ではありません。
求む、冒険者!
AIQ株式会社では、一緒に働いてくれるエンジニアを絶賛、募集しております🐱🐹✨
詳しくは、Wantedly (https://www.wantedly.com/companies/aiqlab)を見てみてください。
参考・引用
AIQ 株式会社 に所属するエンジニアが技術情報をお届けします。 ※ AIQ 株式会社 社員による個人の見解であり、所属する組織の公式見解ではありません。 Wantedly: wantedly.com/companies/aiqlab
Discussion