マップ(Map)

[up] [prev] [next]

目次

マップ(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 ...) で簡単にループ処理できる、などの利点があります。

JavaScript
var map = new Map();
map.set("width", 160);
map.set("height", 120);
map.get("width");       // 160
map.get("height");      // 120

コンストラクタにはキーとバリューの二次元配列を指定できます。Internet Explorer と Safari ではサポートされていません。

JavaScript
var map = new Map([["width", 160], ["height", 120]]);
map.size

リストの個数を返します。

JavaScript
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 ではサポートされていません。

JavaScript
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 でサポートされていません。

JavaScript
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 を返します。

JavaScript
var map = new Map();
map.set("width", 160);
map.has("width");               // => true
map.delete(key)

key で指定したマップを削除します。

JavaScript
var map = new Map();
map.set("width", 160);
map.delete("width");
map.clear()

clear() はマップの情報を消去します。Opera ではサポートされていません。

JavaScript
map.clear();   // mapの中身をすべて消去

WeakMap

WeakMap は Map と似た機能ですが、(1) キーとして利用できるのはオブジェクトのみ、(2) キーは弱参照されガベージコレクションの変数保持の対象とならない、(3) 弱参照のため keys() 等によるキーの一覧を取得することはできない、などの特徴を持ちます。使用例は下記を参照してください。

JavaScript
// 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));
}

[up] [prev] [next]
Copyright (C) 2018-2019 杜甫々
初版:2018年1月21日、最終更新:2019年12月31日
http://www.tohoho-web.com/js/map.htm