JavaScript プログラミング講座

 

Map クラスについて

 


■Map クラスについて

 
■Map クラスについて
 
ECMAScript 6 世代の機能です。
 
Map クラス は、連想配列のクラスです。
 
特に、辞書としての利用に最適です。
 
Map クラスは、データをコレクションする機能がまとまっています。
 
キーを利用して、任意のデータを追加、取得、除外する事ができます。
 
キーとは、任意のデータにアクセスするための、ユニーク(唯一)な識別情報です。
 
■Map クラスと Oject クラスの違い
 
Object クラスは、プロパティ名(文字列)のみを、キーとして利用する事ができます。
 
Map クラスは、さらにオブジェクトの参照も、キーとして利用する事ができます。
 
■辞書としての特性について
 
Map クラスは、内部でハッシュテーブルを使った高速化が実現されています
 
キーを識別情報にして、該当するデータを高速で検索する事ができます。
 
また、すべてのデータの中から該当するデータが存在しない事を、高速で判別する事もできます。
 
データの総数が、100 万以上ある場合でも、瞬時に検索できます。
 
 

 

Map クラスについて

 
 


■マップオブジェクトを作成する

 
マップには、Map クラスと、WeakMap クラスの2つがあります。
 
■ Map と WeakMap クラスの違い
 
Map クラスは、キーとなるオブジェクトが、強参照となります。
 
WeakMap クラスは、キーとなるオブジェクトが、弱参照となります。
 
WeakMap クラスには、格納したデータを、まとめて取得する機能が存在しません。
 
それ以外の、基本的な使い方は、同じです。
 
■ Map オブジェクトを作成する
 
new Map ( Iterator ) :Map
第01引数(略可)Iterator初期値として格納したいデータを、Iterator インターフェース実装済みオブジェクトで指定。
戻り値 MapMap オブジェクトが得られる。
 
Map オブジェクトを作成する

// Map オブジェクトを作成
var map = new Map();

// 出力テスト
console.log(map);
 
■ WeakMap オブジェクトを作成する
 
new WeakMap ( Iterator ) :WeakMap
第01引数(略可)Iterator初期値として格納したいデータを、Iterator インターフェース実装済みオブジェクトで指定。
戻り値 WeakMapWeakMap オブジェクトが得られる。
 
WeakMap オブジェクトを作成する

// WeakMap オブジェクトを作成
var map = new WeakMap();

// 出力テスト
console.log(map);
 

■マップクラスのメソッドについて

 
■マップクラスのメソッド
 
メソッド 説明
set() データを追加する
get() データを取得する
delete() データを除外する
clear() データをすべてクリアする
has() データが存在するか調べる
forEach() コールバック関数を使って、すべてのデータを順番に取得する。
keys() Iterator オブジェクトを作成する。(キー情報のみ)
values() Iterator オブジェクトを作成する。(値情報のみ)
entries() Iterator オブジェクトを作成する。(キーと値情報)
 
■オブジェクトキーについて
 
マップクラスでは、オブジェクトの参照を、キーとして使用する事ができます。
 
Map オブジェクトに、データを追加する

// ------------------------------------------------------------
// Map オブジェクトを作成
// ------------------------------------------------------------
var map = new Map();

// ------------------------------------------------------------
// オブジェクトを作成
// ------------------------------------------------------------
var ary = new Array();
var obj = new Object();

// ------------------------------------------------------------
// データを格納する
// ------------------------------------------------------------
map.set(ary , "あいうえお");
map.set(obj , "かきくけこ");

// ------------------------------------------------------------
// 出力テスト
// ------------------------------------------------------------
console.log(map.get(ary)); // "あいうえお"
console.log(map.get(obj)); // "かきくけこ"
 

■オブジェクトキーの弱参照について

 
■オブジェクトキーの弱参照について
 
WeakMap クラスを使用すると、弱参照となります。
 
これは、オブジェクトをキーとして利用している場合に、効果があります。
 
オブジェクトキーが弱参照となる、WeakMap オブジェクトを作成

// ------------------------------------------------------------
// WeakMap オブジェクトを作成
// ------------------------------------------------------------
var map = new WeakMap();

// 出力テスト
console.log(map);
 
■弱参照の動作について
 
キーとして使用したオブジェクトが、どこからも参照されなくなった場合、ガベージコレクションの対象となります。
 
ガベージコレクションが実行され、オブジェクトが消滅した場合、格納したデータも消滅します。
 
オブジェクトキーが消滅した場合、格納したデータも消滅する(タスクマネージャーからメモリ使用量の変化を確認)

// ------------------------------------------------------------
// WeakMap オブジェクトを作成
// ------------------------------------------------------------
var map = new WeakMap();

// ------------------------------------------------------------
// オブジェクトを作成
// ------------------------------------------------------------
var obj = new Object();

// ------------------------------------------------------------
// 256 MByte 相当のデータを格納する
// ------------------------------------------------------------
map.set(obj , (new Uint8Array(1024 * 1024 * 256)));

// ------------------------------------------------------------
// オブジェクトキーへの参照を断つ(ガベージコレクションが発生すると、格納したデータも連動して消滅する)
// ------------------------------------------------------------
obj = null;
 
■弱参照の使用例について
 
キーとなるオブジェクトが、自動的に消滅する場合に最適です。
 
破棄処理が、不要になります。
 
例えば、DOM オブジェクトを、外部から管理する場合に便利でしょう。
 
DOM オブジェクトは、ノードリストから除外され、自動的に消滅する事があります。
 
DOM オブジェクトをキーにして、任意の付随データを格納します。
 
任意の DOM オブジェクトの参照があれば、付随データを取得できます。
 
付随データが存在しない事を、瞬時に調べる事もできます。
 
すべてのデータは、1つの WeakMap オブジェクト内に格納されます。
 
DOM オブジェクトに、データを保持させる必要はありません。
 
DOM オブジェクト内が、汚染する事はありません。
 
DOM オブジェクトが消滅した場合、付随データも連動して消滅します。
 
DOM オブジェクトが除去されたかを、わざわざ監視する必要はありません。
 
イベントリスナーの、コールバック関数内で使用する例は、こちらです。
 
 

 

データを追加する

 
 


■set() メソッドを使って、データを追加する

 
マップオブジェクトに、データを追加するには、set() メソッドを使用します。
 
キーには、オブジェクトの参照を指定する事もできます。
 
WeakMap クラスの場合、キーにプリミティブな値を指定する事はできません。
 
Map.set ( キー , データ ) :Void
第01引数(略可)Objectキーとなる任意のデータを指定。省略した場合 undefined 値。
第02引数(略可)Object格納したい任意のデータ(値)を指定。省略した場合 undefined 値。
戻り値 Voidなし
 
■使用例
 
Map オブジェクトに、データを追加する(キーにプリミティブ型の値を使用)

// ------------------------------------------------------------
// Map オブジェクトを作成
// ------------------------------------------------------------
var map = new Map();

// ------------------------------------------------------------
// データを格納する
// ------------------------------------------------------------
map.set(false , "あいうえお");
map.set(123 , "かきくけこ");
map.set("str" , "さしすせそ");

// ------------------------------------------------------------
// 出力テスト
// ------------------------------------------------------------
console.log(map.get(false)); // "あいうえお"
console.log(map.get(123)); // "かきくけこ"
console.log(map.get("str")); // "さしすせそ"
 
Map オブジェクトに、データを追加する(キーにリファレンス型の値を使用)

// ------------------------------------------------------------
// Map オブジェクトを作成
// ------------------------------------------------------------
var map = new Map();

// ------------------------------------------------------------
// オブジェクトを作成
// ------------------------------------------------------------
var obj = new Object();
var ary = new Array();

// ------------------------------------------------------------
// データを格納する
// ------------------------------------------------------------
map.set(obj , "たちつてと");
map.set(ary , "なにぬねの");

// ------------------------------------------------------------
// 出力テスト
// ------------------------------------------------------------
console.log(map.get(obj)); // "たちつてと"
console.log(map.get(ary)); // "なにぬねの"
 


 

データを取得する

 
 


■get() メソッドを使って、データを取得する

 
マップオブジェクトから、データを取得するには、get() メソッドを使用します。
 
キーには、オブジェクトの参照を指定する事もできます。
 
WeakMap クラスの場合、キーにプリミティブな値を指定する事はできません。
 
Map.get ( キー ) :Object
第01引数(略可)Objectキーとなる任意のデータを指定。省略した場合 undefined 値。
戻り値 Objectキーに該当するデータが得られる。存在しない場合、undefined 値が得られる。
 
■使用例
 
Map オブジェクトから、データを取得する(キーにプリミティブ型の値を使用)

// ------------------------------------------------------------
// Map オブジェクトを作成
// ------------------------------------------------------------
var map = new Map();

// ------------------------------------------------------------
// データを格納する
// ------------------------------------------------------------
map.set(false , "あいうえお");
map.set(123 , "かきくけこ");
map.set("str" , "さしすせそ");

// ------------------------------------------------------------
// データを取得する
// ------------------------------------------------------------
var a = map.get(false);
var b = map.get(123);
var c = map.get("str");
var d = map.get(999);

// ------------------------------------------------------------
// 出力テスト
// ------------------------------------------------------------
console.log(a); // "あいうえお"
console.log(b); // "かきくけこ"
console.log(c); // "さしすせそ"
console.log(d); // undefined
 
Map オブジェクトから、データを取得する(キーにリファレンス型の値を使用)

// ------------------------------------------------------------
// Map オブジェクトを作成
// ------------------------------------------------------------
var map = new Map();

// ------------------------------------------------------------
// オブジェクトを作成
// ------------------------------------------------------------
var obj = new Object();
var ary = new Array();

// ------------------------------------------------------------
// データを格納する
// ------------------------------------------------------------
map.set(obj , "たちつてと");
map.set(ary , "なにぬねの");

// ------------------------------------------------------------
// データを取得する
// ------------------------------------------------------------
var a = map.get(obj);
var b = map.get(ary);

// ------------------------------------------------------------
// 出力テスト
// ------------------------------------------------------------
console.log(a); // "たちつてと"
console.log(b); // "なにぬねの"
 

■データが存在するか調べる

 
マップオブジェクトに、データが存在するか調べるには、has() メソッドを使用します。
 
WeakMap クラスの場合、キーにプリミティブな値を指定する事はできません。
 
Map.has ( キー ) :Boolean
第01引数(略可)Objectキーとなる任意のデータを指定。省略した場合 undefined 値。
戻り値 Booleanキーに該当するデータが存在する場合 true、存在しない場合 false が得られる。
 
■使用例
 
Map オブジェクトに、データが存在するか調べる(キーにリファレンス型の値を使用)

// ------------------------------------------------------------
// Map オブジェクトを作成
// ------------------------------------------------------------
var map = new Map();

// ------------------------------------------------------------
// オブジェクトを作成
// ------------------------------------------------------------
var obj = new Object();
var ary = new Array();

// ------------------------------------------------------------
// データを格納する
// ------------------------------------------------------------
map.set(obj , "あいうえお");

// ------------------------------------------------------------
// データが存在するか調べる
// ------------------------------------------------------------
var a = map.has(obj);
var b = map.has(ary);

// ------------------------------------------------------------
// 出力テスト
// ------------------------------------------------------------
console.log(a); // true
console.log(b); // false
 

■データの総数を取得する

 
データの総数を取得するには、size プロパティを使用します。
 
このプロパティは、WeakMap クラスには、存在しません。
 
Map オブジェクトの、データの総数を取得する

// ------------------------------------------------------------
// Map オブジェクトを作成
// ------------------------------------------------------------
var map = new Map();

// ------------------------------------------------------------
// データを格納する
// ------------------------------------------------------------
map.set("aaa" , "a");
map.set("bbb" , "b");
map.set("ccc" , "c");
map.set("ddd" , "d");

// ------------------------------------------------------------
// 出力テスト
// ------------------------------------------------------------
console.log(map.size); // 4
 

■すべてのデータを順番に取得する

 
■ for..of 文を使用する
 
for..of 文を使って、アクセスする例です。
 
配列を得ることができます。
 
0 番地にはキー情報、1 番地には値情報が格納されています。
 
この文は、WeakMap クラスでは動作しません。
 
for..of 文を使用して、すべてのデータにアクセスする

// ------------------------------------------------------------
// Map オブジェクトを作成
// ------------------------------------------------------------
var map = new Map();

// ------------------------------------------------------------
// オブジェクトを作成
// ------------------------------------------------------------
var obj = new Object();

// ------------------------------------------------------------
// データを格納する
// ------------------------------------------------------------
map.set("aaa" , false);
map.set("bbb" , 123);
map.set("ccc" , "str");

// ------------------------------------------------------------
// for..of 文を使用して、すべてのデータにアクセスする
// ------------------------------------------------------------
for (var [key,value] of map){
	console.log("---");
	console.log("key:" + key);
	console.log("value:" + value);
}
 

■forEach() メソッドを使って、すべてのデータを順番に取得する

 
すべてのデータを順番に取得するには、forEach() メソッドを使用します。
 
このメソッドは、WeakMap クラスには、存在しません。
 
Map.forEach ( コールバック関数 , this ) :Void
第01引数 Functionコールバック関数を指定する。
第02引数(略可)Objectコールバック関数内で this 演算子に該当するオブジェクトを指定。
戻り値 Voidなし
 
■コールバック関数について
 
第01引数から、値情報が得られます。
 
第02引数から、キー情報が得られます。
 
第03引数から、自身の Map オブジェクトが得られます。
 
■使用例
 
すべてのデータを順番に取得する

// ------------------------------------------------------------
// Map オブジェクトを作成
// ------------------------------------------------------------
var map = new Map();

// ------------------------------------------------------------
// オブジェクトを作成
// ------------------------------------------------------------
var obj = new Object();

// ------------------------------------------------------------
// データを格納する
// ------------------------------------------------------------
map.set("aaa" , false);
map.set("bbb" , 123);
map.set("ccc" , "str");

// ------------------------------------------------------------
// すべてのデータを順番に取得する
// ------------------------------------------------------------
map.forEach(function(value,key,map){
	console.log("---");
	console.log("key:" + key);
	console.log("value:" + value);
	console.log("map:" + map);
});
 


 

データを除外する

 
 


■delete() メソッドを使って、データを除外する

 
マップオブジェクトから、データを除外するには、delete() メソッドを使用します。
 
WeakMap クラスの場合、キーにプリミティブな値を指定する事はできません。
 
Map.delete ( キー ) :Void
第01引数(略可)Objectキーとなる任意のデータを指定。省略した場合 undefined 値。
戻り値 Voidなし
 
■使用例
 
Map オブジェクトから、データを除外する(キーにプリミティブ型の値を使用)

// ------------------------------------------------------------
// Map オブジェクトを作成
// ------------------------------------------------------------
var map = new Map();

// ------------------------------------------------------------
// データを格納する
// ------------------------------------------------------------
map.set(false , "あいうえお");
map.set(123 , "かきくけこ");
map.set("str" , "さしすせそ");

// ------------------------------------------------------------
// データを除外する
// ------------------------------------------------------------
map.delete(false);
map.delete(123);
map.delete("str");

// ------------------------------------------------------------
// 出力テスト
// ------------------------------------------------------------
map.forEach(function(value,key,map){
	console.log("---");
	console.log("key:" + key);
	console.log("value:" + value);
});
 
Map オブジェクトから、データを除外する(キーにリファレンス型の値を使用)

// ------------------------------------------------------------
// Map オブジェクトを作成
// ------------------------------------------------------------
var map = new Map();

// ------------------------------------------------------------
// オブジェクトを作成
// ------------------------------------------------------------
var obj = new Object();
var ary = new Array();

// ------------------------------------------------------------
// データを格納する
// ------------------------------------------------------------
map.set(obj , "たちつてと");
map.set(ary , "なにぬねの");

// ------------------------------------------------------------
// データを除外する
// ------------------------------------------------------------
map.delete(obj);
map.delete(ary);

// ------------------------------------------------------------
// 出力テスト
// ------------------------------------------------------------
map.forEach(function(value,key,map){
	console.log("---");
	console.log("key:" + key);
	console.log("value:" + value);
});
 
WeakMap オブジェクトから、データを除外する(オブジェクトキーの弱参照)

// ------------------------------------------------------------
// WeakMap オブジェクトを作成(弱参照)
// ------------------------------------------------------------
var map = new WeakMap();

// ------------------------------------------------------------
// オブジェクトを作成
// ------------------------------------------------------------
var obj = new Object();
var ary = new Array();

// ------------------------------------------------------------
// データを格納する
// ------------------------------------------------------------
map.set(obj , "たちつてと");
map.set(ary , "なにぬねの");

// ------------------------------------------------------------
// オブジェクトキーへの参照を断つ
// ------------------------------------------------------------
obj = null;
ary = null;
 

■すべてのデータをクリアする

 
マップオブジェクトから、すべてのデータを除外するには、clear() メソッドを使用します。
 
■使用例
 
マップオブジェクトから、すべてのデータを除外する

// ------------------------------------------------------------
// Map オブジェクトを作成
// ------------------------------------------------------------
var map = new Map();

// ------------------------------------------------------------
// データを格納する
// ------------------------------------------------------------
map.set("aaa" , "あいうえお");
map.set("bbb" , "かきくけこ");
map.set("ccc" , "さしすせそ");

// ------------------------------------------------------------
// データをすべてクリアする
// ------------------------------------------------------------
map.clear();

// ------------------------------------------------------------
// 出力テスト
// ------------------------------------------------------------
console.log(map.size); // 0