マップ(Map)
マップ(Map)
map = new Map([iterable])
map.set(key, value)
map.get(key)
ES6(ES2015) でサポートされたオブジェクトで、キーとバリューのリストを保持します。Chrome 38, Firefox 13, Internet Explorer 11, Opera 25, Safari 7.1 以降で使用できます。Map と Object は似ていますが、Map には、文字列や Symbol 以外の値もキーとして利用できる、リストの個数を size で簡単に得ることができる、for (... of ...) で簡単にループ処理できる、などの利点があります。
var map = new Map(); map.set("width", 160); map.set("height", 120); map.get("width"); // 160 map.get("height"); // 120
コンストラクタにはキーとバリューの二次元配列を指定できます。Internet Explorer と Safari ではサポートされていません。
var map = new Map([["width", 160], ["height", 120]]);
map.size
リストの個数を返します。
var map = new Map();
map.set("width", 160);
map.set("height", 120);
map.size; // => 2
map.keys()
map.values()
map.entries()
for ... of 文でキー・バリューのリストを扱うことができます。Internet Explorer と Opera ではサポートされていません。
for (var [key, value] of map) { console.log(key, ":", value); } for (var key of map.keys()) { console.log(key, ":", map.get(key)); } for (var value of map.values()) { console.log(value); } for (var [key, value] of map.entries()) { console.log(key, ":", value); }
map.forEach(function[, this])
forEach 文でキー・バリューのリストを扱うことができます。こちらは、Internet Explorer でもサポートされていますが、Opera でサポートされていません。
map.forEach(function(value) { console.log(value); }) map.forEach(function(value, key) { console.log(key, ":", value); }) map.forEach(function(value, key, map) { map.set(key, value * 2); console.log(key, ":", map.get(key)); // map自体を変更することが可能 }); map.forEach(function(value, key) { this.set(key, value * 2); console.log(key, ":", this.get(key)); }, map); // mapをthisとして引き渡す
map.has(key)
key で指定したマップが存在すれば true を、存在しなければ false を返します。
var map = new Map();
map.set("width", 160);
map.has("width"); // => true
map.delete(key)
key で指定したマップを削除します。
var map = new Map(); map.set("width", 160); map.delete("width");
map.clear()
clear() はマップの情報を消去します。Opera ではサポートされていません。
map.clear(); // mapの中身をすべて消去
Map.groupBy(array, function)
ES2024 で追加されました。array を、要素とインデックスを引数とする関数 function の結果をキーにグルーピングしたマップを返します。Object.groupBy() でも類似のことができますが、キーが文字列である必要があります。Map.groupBy() ではキーが数値やオブジェクトなど文字列以外の場合にもグルーピングすることができます。
const members = [ { name: "Yamada", address: "Tokyo" }, { name: "Suzuki", address: "Osaka" }, { name: "Tanaka", address: "Nagoya" }, { name: "Kaneda", address: "Tokyo" } ]; Map.groupBy(members, (member, index) => { return member.address; }); // Map { // Tokyo => [ { name: "Yamada", address: "Tokyo" }, { name: "Kaneda", address: "Tokyo" } ], // Osaka => [ { name: "Suzuki", address: "Osaka" } ], // Nagoya => [ { name: "Tanaka", address: "Nagoya" } ] // }
WeakMap
WeakMap は Map と似た機能ですが、(1) キーとして利用できるのはオブジェクトのみ、(2) キーは弱参照されガベージコレクションの変数保持の対象とならない、(3) 弱参照のため keys() 等によるキーの一覧を取得することはできない、などの特徴を持ちます。使用例は下記を参照してください。
// Personクラスを定義する class Person { constructor(name) { this.name = name } getName() { return(this.name); } } // 趣味(favorites)強参照マップと、宗教(religions)弱参照マップを定義する const favorites = new Map(); const religions = new WeakMap(); // 処理の中で趣味マップと、宗教マップを利用する function doSomething() { // 山田さんオブジェクトを生成 let p1 = new Person("Yamada", 26); console.log(p1.getName()); // 山田さんの趣味は野球 favorites.set(p1, "Baseball"); console.log(favorites.get(p1)); // 山田さんの宗教は仏教 religions.set(p1, "Buddhism"); console.log(religions.get(p1)); } doSomething(); // 趣味マップは強参照のため、後からでも参照できるけど、ガベージコレクションされない for (var key of favorites.keys()) { console.log(key.name + ":" + favorites.get(key)); } // 宗教マップは弱参照のため、後から参照できないけど、ガベージコレクションされる for (var key of religions.keys()) { // TypeError console.log(key.name + ":" + religions.get(key)); }