ES6-コレクション
ES6では、マップとセットという2つの新しいデータ構造が導入されています。
Maps −このデータ構造により、キーを値にマッピングできます。
Sets−セットは配列に似ています。ただし、セットは重複を推奨しません。
マップ
Mapオブジェクトは、単純なキーと値のペアです。マップ内のキーと値は、プリミティブまたはオブジェクトの場合があります。
以下はその構文です。
new Map([iterable])
パラメータiterableは、要素がキーと値のペアで構成される反復可能なオブジェクトを表します。マップは順序付けられています。つまり、挿入順に要素をトラバースします。
マップのプロパティ
| シニア番号 | プロパティと説明 | 
|---|---|
| 1 | 
Map.prototype.size
 このプロパティは、Mapオブジェクトのキーと値のペアの数を返します。  | 
基本的なマップ操作を理解する
set()関数は、Mapオブジェクトのキーの値を設定します。set()関数は、キーとその値という2つのパラメーターを取ります。この関数は、Mapオブジェクトを返します。
has()関数は、指定されたキーがMapオブジェクトにあるかどうかを示すブール値を返します。この関数は、キーをパラメーターとして受け取ります。
var map = new Map(); 
map.set('name','Tutorial Point'); 
map.get('name'); // Tutorial point
上記の例では、マップオブジェクトを作成します。マップには要素が1つだけあります。要素キーはで示されますname。キーは値にマップされますTutorial point。
Note−マップは類似した値を区別しますが、データ型は異なります。言い換えれば、integer key 1 とは異なると見なされます string key “1”。この概念をよりよく理解するために、次の例を検討してください
var map = new Map(); 
map.set(1,true); 
console.log(map.has("1")); //false 
map.set("1",true); 
console.log(map.has("1")); //true
出力
false 
true
ザ・ set()メソッドも連鎖可能です。次の例を考えてみましょう。
var roles = new Map(); 
roles.set('r1', 'User') 
.set('r2', 'Guest') 
.set('r3', 'Admin'); 
console.log(roles.has('r1'))
出力
True
上記の例では、マップオブジェクトを定義しています。この例では、set()関数をチェーンして、キーと値のペアを定義します。
ザ・ get() 関数は、指定されたキーに対応する値を取得するために使用されます。
Mapコンストラクターに配列を渡すこともできます。さらに、mapは、配列を表すためのspread演算子の使用もサポートしています。
例
var roles = new Map([ 
   ['r1', 'User'], 
   ['r2', 'Guest'], 
   ['r3', 'Admin'], 
]);  
console.log(roles.get('r2'))
上記のコードが正常に実行されると、次の出力が表示されます。
Guest
Note −指定されたキーがマップに存在しない場合、get()関数はundefinedを返します。
set()は、キーがすでにマップに存在する場合、その値を置き換えます。次の例を考えてみましょう。
var roles = new Map([ 
   ['r1', 'User'], 
   ['r2', 'Guest'], 
   ['r3', 'Admin'], 
]);  
console.log(`value of key r1 before set(): ${roles.get('r1')}`) 
roles.set('r1','superUser') 
console.log(`value of key r1 after set(): ${roles.get('r1')}`)
上記のコードが正常に実行されると、次の出力が表示されます。
value of key r1 before set(): User 
value of key r1 after set(): superUser
マップメソッド
| シニア番号 | 方法と説明 | 
|---|---|
| 1 | 
Map.prototype.clear()
 Mapオブジェクトからすべてのキーと値のペアを削除します。  | 
| 2 | 
Map.prototype.delete(key)
 キーに関連付けられている値をすべて削除し、Map.prototype.has(key)が以前に返した値を返します。 Map.prototype.has(key)は、後でfalseを返します。  | 
| 3 | 
Map.prototype.entries()
 を含む新しいイテレータオブジェクトを返します an array of Mapオブジェクトの各要素の[キー、値]を挿入順に並べます。  | 
| 4 | 
Map.prototype.forEach(callbackFn [、thisArg])
 呼び出し callbackFnMapオブジェクトに存在するキーと値のペアごとに1回、挿入順に。thisArgパラメーターがforEachに提供されている場合、それは各コールバックの「this」値として使用されます。  | 
| 5 | 
Map.prototype.keys()
 を含む新しいイテレータオブジェクトを返します keys Mapオブジェクトの各要素に対して挿入順に。  | 
| 6 | 
Map.prototype.values()
 を含む新しいイテレータオブジェクトを返します an array of Mapオブジェクトの各要素の[キー、値]を挿入順に並べます。  | 
for…ofLoop
次の例は、for…ofループを使用してマップをトラバースする方法を示しています。
'use strict' 
var roles = new Map([ 
   ['r1', 'User'], 
   ['r2', 'Guest'], 
   ['r3', 'Admin'], 
]);
for(let r of roles.entries()) 
console.log(`${r[0]}: ${r[1]}`);
上記のコードが正常に実行されると、次の出力が表示されます。
r1: User 
r2: Guest 
r3: Admin
弱いマップ
弱いマップは、次の例外を除いてマップと同じです。
そのキーはオブジェクトでなければなりません。
弱いマップのキーはガベージコレクションできます。 Garbage collection プログラム内の参照されていないオブジェクトによって占有されているメモリをクリアするプロセスです。
弱いマップを繰り返したりクリアしたりすることはできません。
例:弱いマップ
'use strict' 
let weakMap = new WeakMap(); 
let obj = {}; 
console.log(weakMap.set(obj,"hello"));  
console.log(weakMap.has(obj));// true
上記のコードが正常に実行されると、次の出力が表示されます。
WeakMap {} 
true
セット
セットはES6データ構造です。重複を含めることができないことを除いて、配列に似ています。つまり、一意の値を格納できます。セットは、プリミティブ値とオブジェクト参照の両方をサポートします。
マップと同様に、セットも順序付けられます。つまり、要素は挿入順序で繰り返されます。セットは、次の構文を使用して初期化できます。
プロパティを設定する
| シニア番号 | プロパティと説明 | 
|---|---|
| 1 | 
Set.prototype.size
 Setオブジェクトの値の数を返します。  | 
メソッドの設定
| シニア番号 | 方法と説明 | 
|---|---|
| 1 | 
Set.prototype.add(value)
 指定された値を持つ新しい要素をSetオブジェクトに追加します。Setオブジェクトを返します。  | 
| 2 | 
Set.prototype.clear()
 Setオブジェクトからすべての要素を削除します。  | 
| 3 | 
Set.prototype.delete(value)
 値に関連付けられている要素を削除します。  | 
| 4 | 
Set.prototype.entries()
 を含む新しいイテレータオブジェクトを返します an array ofSetオブジェクトの各要素の[値、値]、挿入順。これはMapオブジェクトと同様に維持されるため、各エントリのキーと値はここで同じになります。  | 
| 5 | 
Set.prototype.forEach(callbackFn [、thisArg])
 呼び出し callbackFnSetオブジェクトに存在する値ごとに、挿入順に1回。場合athisArg パラメータはforEachに提供され、各コールバックの「this」値として使用されます。  | 
| 6 | 
Set.prototype.has(value)
 Setオブジェクトに指定された値で要素が存在するかどうかを表明するブール値を返します。  | 
| 7 | 
Set.prototype.values()
 を含む新しいイテレータオブジェクトを返します values Setオブジェクトの各要素に対して挿入順に。  | 
弱いセット
弱いセットにはオブジェクトのみを含めることができ、それらに含まれるオブジェクトはガベージコレクションされる可能性があります。弱いマップと同様に、弱いセットを繰り返すことはできません。
例:弱いセットの使用
'use strict' 
   let weakSet = new WeakSet();  
   let obj = {msg:"hello"}; 
   weakSet.add(obj); 
   console.log(weakSet.has(obj)); 
   weakSet.delete(obj); 
   console.log(weakSet.has(obj));
上記のコードが正常に実行されると、次の出力が表示されます。
true 
false
イテレータ
イテレータは、オブジェクトのコレクションに一度に1つずつアクセスできるようにするオブジェクトです。setとmapの両方に、イテレータを返すメソッドがあります。
イテレータは next()方法。next()メソッドが呼び出されると、次のオブジェクトが返されます。'value' そして 'done'プロパティ 。'done'はブール値です。これは、コレクション内のすべてのアイテムを読み取った後にtrueを返します。
例1:セットとイテレータ
var  set = new Set(['a','b','c','d','e']);  
var iterator = set.entries(); 
console.log(iterator.next())
上記のコードが正常に実行されると、次の出力が表示されます。
{ value: [ 'a', 'a' ], done: false }
セットにはキー/値が格納されないため、値の配列には同様のキーと値が含まれます。読み取る要素が多いため、doneはfalseになります。
例2:セットとイテレータ
var  set = new Set(['a','b','c','d','e']);  
var iterator = set.values(); 
console.log(iterator.next());
上記のコードが正常に実行されると、次の出力が表示されます。
{ value: 'a', done: false }
例3:セットとイテレータ
var  set = new Set(['a','b','c','d','e']);  
var iterator = set.keys(); 
console.log(iterator.next());
上記のコードが正常に実行されると、次の出力が表示されます。
{ value: 'a', done: false }
例4:マップとイテレータ
var map = new Map([[1,'one'],[2,'two'],[3,'three']]); 
var iterator = map.entries(); 
console.log(iterator.next());
上記のコードが正常に実行されると、次の出力が表示されます。
{ value: [ 1, 'one' ], done: false }
例5:マップとイテレータ
var map = new Map([[1,'one'],[2,'two'],[3,'three']]); 
var iterator = map.values(); 
console.log(iterator.next());
上記のコードが正常に実行されると、次の出力が表示されます。
{value: "one", done: false}
例6:マップとイテレータ
var map = new Map([[1,'one'],[2,'two'],[3,'three']]); 
var iterator = map.keys(); 
console.log(iterator.next());
上記のコードが正常に実行されると、次の出力が表示されます。
{value: 1, done: false}