概要このチュートリアルでは、任意のタイプのユニークな値のコレクションを効果的に管理できるJavaScript Set
オブジェクトについて説明します。
JavaScript Setオブジェクトの導入
ES6には、任意のタイプのユニークな値のコレクションを格納する新しいタイプSet
が用意されています。新しい空のSet
を作成するには、次の構文を使用します
let setObject = new Set();
Code language: JavaScript (javascript)
また、Set
コンストラクタはオプションの反復可能オブジェクトも受け入れます。Set
コンストラクタに反復可能オブジェクトを渡すと、反復可能オブジェクトのすべての要素が新しいセットに追加されます
let setObject = new Set(iterableObject);
Code language: JavaScript (javascript)
便利なセットメソッド
Set
オブジェクトは、以下の便利なメソッドを提供します
add(value)
– セットに指定された値を持つ新しい要素を追加します。Set
オブジェクトを返します。そのため、このメソッドを別のSet
メソッドとチェーンできます。clear()
–Set
オブジェクトからすべての要素を削除します。delete(value)
– 値で指定された要素を削除します。entries()
–[value, value]
の配列を含む新しい反復子
を返します。forEach(callback [, thisArg])
–Set
の各要素でコールバックを呼び出し、各呼び出しでthis
値をthisArg
に設定します。has(value)
– 指定された値を持つ要素がセット内にある場合はtrue
を返し、ない場合はfalse
を返します。keys()
–values()
関数と同じです。[@@iterator]
– 挿入順序で格納されたすべての要素の値を含む新しい反復子オブジェクトを返します。
JavaScriptのセット例
配列から新しいセットを作成する
次の例では、配列から新しいSetを作成する方法を示します。
let chars = new Set(['a', 'a', 'b', 'c', 'c']);
Code language: JavaScript (javascript)
セット内のすべての要素はユニークである必要があり、そのためchars
には3つの個々の要素a
、b
、c
のみが含まれます。
console.log(chars);
Code language: JavaScript (javascript)
出力
Set { 'a', 'b', 'c' }
Code language: JavaScript (javascript)
chars
にtypeof
演算子を使用すると、object
を返します。
console.log(typeof(chars));
Code language: JavaScript (javascript)
出力
object
chars
セットはSet
タイプのインスタンスであるため、次のステートメントはtrue
を返します。
let result = chars instanceof Set;
console.log(result);
Code language: JavaScript (javascript)
セットのサイズを取得する
セットが保持する要素の数を取得するには、Set
オブジェクトのsize
プロパティを使用します。
let size = chars.size;
console.log(size);// 3
Code language: JavaScript (javascript)
セットに要素を追加する
セットに要素を追加するには、add()
メソッドを使用します。
chars.add('d');
console.log(chars);
Code language: JavaScript (javascript)
出力
Set { 'a', 'b', 'c', 'd' }
Code language: JavaScript (javascript)
add()
メソッドはチェーン可能であるため、チェーンステートメントを使用してセットに複数のアイテムを追加できます
chars.add('e')
.add('f');
Code language: JavaScript (javascript)
値がセット内にあるかどうかを確認する
セットに特定の要素があるかどうかを確認するには、has()
メソッドを使用します。has()
メソッドは、セットに要素が含まれている場合はtrue
を返し、それ以外の場合はfalse
を返します。chars
セットに'a'
が含まれているため、次のステートメントはtrue
を返します
let exist = chars.has('a');
console.log(exist);// true
Code language: JavaScript (javascript)
以下のステートメントは chars
セットに'z'
値が含まれていないため、false
を返します。
exist = chars.has('z');
console.log(exist); // false
Code language: JavaScript (javascript)
セットから要素を削除します
セットから指定された要素を削除するには、delete()
メソッドを使用します。以下のステートメントは chars
セットから'f'
値を削除します。
chars.delete('f');
console.log(chars); // Set {"a", "b", "c", "d", "e"}
Code language: JavaScript (javascript)
出力
Set { 'a', 'b', 'c', 'd', 'e' }
Code language: JavaScript (javascript)
delete()
メソッドは、要素が正常に削除されたことを示すtrue
を返します。セットのすべての要素を削除するには、clear()
メソッドを使用します。
chars.clear();
console.log(chars); // Set{}
Code language: JavaScript (javascript)
JavaScript Setの要素をループ
Setオブジェクトは要素の挿入順を維持するため、要素を反復処理すると、要素の順序は挿入順と同じになります。次の例では、次のようにユーザーのロールのセットがあります。
let roles = new Set();
roles.add('admin')
.add('editor')
.add('subscriber');
Code language: JavaScript (javascript)
次の例ではfor…ofループを使用して、charsセットを反復処理します。
for (let role of roles) {
console.log(role);
}
Code language: JavaScript (javascript)
出力
admin
editor
subscriber
Set
は、Mapのようにkeys(),
values(),
およびentries()
メソッドも提供します。ただし、Set
のキーと値は同一です。たとえば
for (let [key, value] of roles.entries()) {
console.log(key === value);
}
Code language: JavaScript (javascript)
出力
true
true
true
Code language: JavaScript (javascript)
セットの各要素でコールバック関数を呼び出す
セットの各要素でコールバックを呼び出す場合は、forEach()
メソッドを使用できます。
roles.forEach(role => console.log(role.toUpperCase()));
Code language: JavaScript (javascript)
WeakSets
WeakSet
はSet
に似ていますが、オブジェクトのみが含まれます。WeakSet
内のオブジェクトは自動的にガベージコレクションされる可能性があるため、WeakSet
にはsize
プロパティがありません。WeakMap
のように、WeakSet
の要素を反復処理することはできないため、実際の運用ではWeakSetがほとんど使用されていないことがわかります。実際、WeakSet
のみを使用して、指定された値がセット内にあるかどうかを確認します。例を次に示します。
let computer = {type: 'laptop'};
let server = {type: 'server'};
let equipment = new WeakSet([computer, server]);
if (equipment.has(server)) {
console.log('We have a server');
}
Code language: JavaScript (javascript)
出力
We have a server
このチュートリアルでは、JavaScriptSet
オブジェクトとその要素の操作方法について学習しました。