Map オブジェクトは単純なキー/値写像(マップ)です。キーあるいは値として任意の値(オブジェクト、プリミティブ値とも)を使うことができます。
構文
new Map([iterable])
引数
iterable- 要素がキー・値の対(2 要素の配列)である
Arrayまたは他の反復処理可能なオブジェクトです(例:[[ 1, 'one' ],[ 2, 'two' ]])。それぞれのキー・値ペアが新しい Map に追加されます。nullはundefinedと同じに扱われます(訳注:つまり引数を指定しない場合と同じに扱われます)。
解説
Map オブジェクトはその要素について挿入順で反復処理を行うことができます。for...of ループは各処理で [キー, 値] の配列を返します。
ObjectのMap、特に辞書の辞書であるMapは、Objectの挿入順にのみマップされることに注意してください。これは、ランダムで順序付けられていません。
キーの等価性
キーの等価性は「same-value」アルゴリズムに基づきます:(NaN !== NaN であるにもかかわらず)NaN は NaN と同一と見なされ、他のすべての値は === 演算子の動作に従って等しいと見なされます。ECMAScript 6 ドラフトの以前の版では(-0 === +0 であるにもかかわらず) -0 と +0 は異なると見なされていましたが、後の版で変更され、Gecko 29 (Firefox 29 / Thunderbird 29 / SeaMonkey 2.26) (バグ 952870) と最近の nightly Chrome で適用されています。
オブジェクトとマップの比較
Objects と Map は、両者とも値へのキーを設定したり、それらの値を取り出したり、キーを削除したり、また何かがあるキーに格納されているかを判定したりすることができるという点で似ています。このため、歴史的に Object は Map として使われてきました。しかし、Map の使用を望ましくする Object と Map 間の重要な違いが存在します。
ObjectのキーはStringsとSymbolsですが、Mapでは任意の値がキーとなり得ます。Mapの大きさはsizeプロパティで簡単に得ることができます。一方、Objectの大きさは手動で保つ必要があります。Mapは iterable で ダイレクトに反復処理できる一方、オブジェクトを反復処理するには、何らかの方法でキーを取得し、それらのキーを元に反復処理する必要があります。Objectはプロトタイプを持つため、既定のキーがマップ中に存在します。ES5ではこれをmap = Object.create(null)を使うことで回避することができますが、推奨しません。Mapは、頻繁に要素を追加したり削除したりするシナリオでは、パフォーマンスがObjectに比べて良い場合があります。
プロパティ
Map.lengthlengthプロパティの値は 0 です。get Map[@@species]- 派生クラスを生成するためのコンストラクタ関数です。
Map.prototypeMapコンストラクタのプロトタイプを表します。すべてのMapオブジェクトに追加のプロパティを定義できます。
Map インスタンス
すべての Map インスタンスは Map.prototype を継承します。
プロパティ
Map.prototype.constructor- インスタンスのプロトタイプを生成する関数を返します。これはデフォルト
Map関数です。 Map.prototype.sizeMapオブジェクト内のキー/バリューペアの数を返します。
メソッド
Map.prototype.clear()Mapオブジェクトからすべてのキー/バリューペアを削除します。Map.prototype.delete(key)keyに関連した値を削除しMap.prototype.has(value)が以前返した値を返します。Map.prototype.has(key)はその後falseを返します。Map.prototype.entries()Mapオブジェクト内の要素に対して挿入順に[key, value]の配列を含む新しいIteratorオブジェクトを返します。Map.prototype.forEach(callbackFn[, thisArg])Mapオブジェクトに存在するキー/バリューペアに対して挿入順に一回callback関数を呼び出します。thisArg 引数がforEachに提供された場合、callbackに対するこの値として使われます。Map.prototype.get(key)keyに関連した値を返します。存在しない場合、undefinedを返します。Map.prototype.has(key)Mapオブジェクト内にkeyに関連した要素が存在するかどうかを示すbooleanを返します。Map.prototype.keys()Mapオブジェクト内の要素に対して挿入順にkeys を含む新しいIteratorオブジェクトを返します。Map.prototype.set(key, value)Mapオブジェクト内にkeyに対する値を設定します。Mapオブジェクトを返します。Map.prototype.values()Mapオブジェクトの要素に対して挿入順にvaluesを含む新しいIteratorオブジェクトを返します。Map.prototype[@@iterator]()Mapオブジェクト内の要素に対して挿入順に[key, value]の配列を含む新しいIteratorオブジェクトを返します。
例
Map オブジェクトの使用
var myMap = new Map();
var keyString = "文字列",
keyObj = {},
keyFunc = function() {};
// 値を設定する
myMap.set(keyString, "'文字列' と関連付けられた値");
myMap.set(keyObj, "keyObj と関連付けられた値");
myMap.set(keyFunc, "keyFunc と関連付けられた値");
myMap.size; // 3
// 値を取得する
myMap.get(keyString); // "'文字列' と関連付けられた値"
myMap.get(keyObj); // "keyObj と関連付けられた値"
myMap.get(keyFunc); // "keyFunc と関連付けられた値"
myMap.get("文字列"); // "'文字列' と関連付けられた値"
// keyString === '文字列' であるため
myMap.get({}); // undefined, keyObj !== {} であるため
myMap.get(function() {}) // undefined, keyFunc !== function () {} であるため
Map のキーとしての NaN の 使用
NaN もまたキーとして使うことができます。すべての NaN は自身と等しくない(NaN !== NaN は真)にもかかわらず、以下の例は動作します。これは NaN が互いに区別できないためです。
var myMap = new Map();
myMap.set(NaN, 'not a number');
myMap.get(NaN); // "not a number"
var otherNaN = Number('foo');
myMap.get(otherNaN); // "not a number"
for..of を使用する Map の反復処理
Map は for..of ループを使用して反復処理を行うことができます。
var myMap = new Map();
myMap.set(0, 'zero');
myMap.set(1, 'one');
for (var [key, value] of myMap) {
console.log(key + ' = ' + value);
}
// 0 = zero
// 1 = one
for (var key of myMap.keys()) {
console.log(key);
}
// 0
// 1
for (var value of myMap.values()) {
console.log(value);
}
// zero
// one
for (var [key, value] of myMap.entries()) {
console.log(key + ' = ' + value);
}
// 0 = zero
// 1 = one
forEach() で Maps を反復処理
Map は forEach() メソッドを使用して反復できます:
myMap.forEach(function(value, key) {
console.log(key + ' = ' + value);
});
// 1行目に"0 = zero"、2行目に"1 = one"が出力されます。
Array オブジェクトとの関係
var kvArray = [["キー1", "値1"], ["キー2", "値2"]];
// 通常の Map コンストラクタを使って、キー・値の 2 次元配列をマップに変換する
var myMap = new Map(kvArray);
myMap.get("キー1"); // "値1" を返す
// 展開演算子を使って、マップをキー・値の 2 次元配列に変換する
console.log(Array.from(myMap)); // kvArray とまったく同じ Array を表示する
// あるいは展開演算子をキーまたは値のイテレータに使って、キーまたは値のみの配列を得る
console.log(Array.from(myMap.keys())); // ["key1", "key2"] が出力される
標準仕様
| 仕様書 | 策定状況 | コメント |
|---|---|---|
| ECMAScript 2015 (6th Edition, ECMA-262) Map の定義 |
標準 | 初期定義。 |
| ECMAScript Latest Draft (ECMA-262) Map の定義 |
ドラフト |
ブラウザ互換性
| デスクトップ | モバイル | サーバー | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Map | Chrome 完全対応 38 | Edge 完全対応 12 | Firefox 完全対応 13 | IE 完全対応 11 | Opera 完全対応 25 | Safari 完全対応 8 | WebView Android 完全対応 38 | Chrome Android 完全対応 38 | Firefox Android 完全対応 14 | Opera Android 完全対応 25 | Safari iOS 完全対応 8 | Samsung Internet Android 完全対応 3.0 | nodejs
完全対応
0.12
|
clear | Chrome 完全対応 38 | Edge 完全対応 12 | Firefox 完全対応 19 | IE 完全対応 11 | Opera 完全対応 25 | Safari 完全対応 8 | WebView Android 完全対応 38 | Chrome Android 完全対応 38 | Firefox Android 完全対応 19 | Opera Android 完全対応 25 | Safari iOS 完全対応 8 | Samsung Internet Android 完全対応 3.0 | nodejs 完全対応 0.12 |
delete | Chrome 完全対応 38 | Edge 完全対応 12 | Firefox 完全対応 13 | IE 完全対応 11 | Opera 完全対応 25 | Safari 完全対応 8 | WebView Android 完全対応 38 | Chrome Android 完全対応 38 | Firefox Android 完全対応 14 | Opera Android 完全対応 25 | Safari iOS 完全対応 8 | Samsung Internet Android 完全対応 3.0 | nodejs
完全対応
0.12
|
entries | Chrome 完全対応 38 | Edge 完全対応 12 | Firefox 完全対応 20 | IE 未対応 なし | Opera 完全対応 25 | Safari 完全対応 8 | WebView Android 完全対応 38 | Chrome Android 完全対応 38 | Firefox Android 完全対応 20 | Opera Android 完全対応 25 | Safari iOS 完全対応 8 | Samsung Internet Android 完全対応 3.0 | nodejs 完全対応 0.12 |
forEach | Chrome 完全対応 38 | Edge 完全対応 12 | Firefox 完全対応 25 | IE 完全対応 11 | Opera 完全対応 25 | Safari 完全対応 8 | WebView Android 完全対応 38 | Chrome Android 完全対応 38 | Firefox Android 完全対応 25 | Opera Android 完全対応 25 | Safari iOS 完全対応 8 | Samsung Internet Android 完全対応 3.0 | nodejs 完全対応 0.12 |
get | Chrome 完全対応 38 | Edge 完全対応 12 | Firefox 完全対応 13 | IE 完全対応 11 | Opera 完全対応 25 | Safari 完全対応 8 | WebView Android 完全対応 38 | Chrome Android 完全対応 38 | Firefox Android 完全対応 14 | Opera Android 完全対応 25 | Safari iOS 完全対応 8 | Samsung Internet Android 完全対応 3.0 | nodejs 完全対応 あり |
has | Chrome 完全対応 38 | Edge 完全対応 12 | Firefox 完全対応 13 | IE 完全対応 11 | Opera 完全対応 25 | Safari 完全対応 8 | WebView Android 完全対応 38 | Chrome Android 完全対応 38 | Firefox Android 完全対応 14 | Opera Android 完全対応 25 | Safari iOS 完全対応 8 | Samsung Internet Android 完全対応 3.0 | nodejs 完全対応 あり |
| Key equality for -0 and 0 | Chrome 完全対応 38 | Edge 完全対応 12 | Firefox 完全対応 29 | IE 未対応 なし | Opera 完全対応 25 | Safari 完全対応 9 | WebView Android 完全対応 38 | Chrome Android 完全対応 38 | Firefox Android 完全対応 29 | Opera Android 完全対応 25 | Safari iOS 完全対応 9 | Samsung Internet Android 完全対応 3.0 | nodejs 完全対応 4.0.0 |
keys | Chrome 完全対応 38 | Edge 完全対応 12 | Firefox 完全対応 20 | IE 未対応 なし | Opera 完全対応 25 | Safari 完全対応 8 | WebView Android 完全対応 38 | Chrome Android 完全対応 38 | Firefox Android 完全対応 20 | Opera Android 完全対応 25 | Safari iOS 完全対応 8 | Samsung Internet Android 完全対応 3.0 | nodejs 完全対応 0.12 |
new Map(iterable) | Chrome 完全対応 38 | Edge 完全対応 12 | Firefox 完全対応 13 | IE 未対応 なし | Opera 完全対応 25 | Safari 完全対応 9 | WebView Android 完全対応 38 | Chrome Android 完全対応 38 | Firefox Android 完全対応 14 | Opera Android 完全対応 25 | Safari iOS 完全対応 9 | Samsung Internet Android 完全対応 3.0 | nodejs 完全対応 0.12 |
new Map(null) | Chrome 完全対応 38 | Edge 完全対応 12 | Firefox 完全対応 37 | IE 完全対応 11 | Opera 完全対応 25 | Safari 完全対応 9 | WebView Android 完全対応 38 | Chrome Android 完全対応 38 | Firefox Android 完全対応 37 | Opera Android 完全対応 25 | Safari iOS 完全対応 9 | Samsung Internet Android 完全対応 3.0 | nodejs
完全対応
0.12
|
Map() without new throws | Chrome 完全対応 38 | Edge 完全対応 12 | Firefox 完全対応 42 | IE 完全対応 11 | Opera 完全対応 25 | Safari 完全対応 9 | WebView Android 完全対応 38 | Chrome Android 完全対応 38 | Firefox Android 完全対応 42 | Opera Android 完全対応 25 | Safari iOS 完全対応 9 | Samsung Internet Android 完全対応 3.0 | nodejs 完全対応 0.12 |
prototype | Chrome 完全対応 38 | Edge 完全対応 12 | Firefox 完全対応 13 | IE 完全対応 11 | Opera 完全対応 25 | Safari 完全対応 8 | WebView Android 完全対応 38 | Chrome Android 完全対応 38 | Firefox Android 完全対応 14 | Opera Android 完全対応 25 | Safari iOS 完全対応 8 | Samsung Internet Android 完全対応 3.0 | nodejs 完全対応 あり |
set | Chrome 完全対応 38 | Edge 完全対応 12 | Firefox 完全対応 13 | IE
部分対応
11
| Opera 完全対応 25 | Safari 完全対応 8 | WebView Android 完全対応 38 | Chrome Android 完全対応 38 | Firefox Android 完全対応 14 | Opera Android 完全対応 25 | Safari iOS 完全対応 8 | Samsung Internet Android 完全対応 3.0 | nodejs 完全対応 あり |
size | Chrome 完全対応 38 | Edge 完全対応 12 | Firefox
完全対応
19
| IE 完全対応 11 | Opera 完全対応 25 | Safari 完全対応 8 | WebView Android 完全対応 38 | Chrome Android 完全対応 38 | Firefox Android
完全対応
19
| Opera Android 完全対応 25 | Safari iOS 完全対応 8 | Samsung Internet Android 完全対応 3.0 | nodejs 完全対応 0.12 |
values | Chrome 完全対応 38 | Edge 完全対応 12 | Firefox 完全対応 20 | IE 未対応 なし | Opera 完全対応 25 | Safari 完全対応 8 | WebView Android 完全対応 38 | Chrome Android 完全対応 38 | Firefox Android 完全対応 20 | Opera Android 完全対応 25 | Safari iOS 完全対応 8 | Samsung Internet Android 完全対応 3.0 | nodejs 完全対応 0.12 |
@@iterator | Chrome 完全対応 43 | Edge 完全対応 12 | Firefox
完全対応
36
| IE 未対応 なし | Opera 完全対応 30 | Safari 完全対応 あり | WebView Android 完全対応 43 | Chrome Android 完全対応 43 | Firefox Android
完全対応
36
| Opera Android 完全対応 30 | Safari iOS 完全対応 あり | Samsung Internet Android 完全対応 4.0 | nodejs 完全対応 0.12 |
@@species | Chrome 完全対応 51 | Edge 完全対応 13 | Firefox 完全対応 41 | IE 未対応 なし | Opera 完全対応 38 | Safari 完全対応 10 | WebView Android 完全対応 51 | Chrome Android 完全対応 51 | Firefox Android 完全対応 41 | Opera Android 完全対応 41 | Safari iOS 完全対応 10 | Samsung Internet Android 完全対応 5.0 | nodejs
完全対応
6.5.0
|
@@toStringTag | Chrome 完全対応 44 | Edge 未対応 なし | Firefox 完全対応 51 | IE 未対応 なし | Opera 未対応 なし | Safari 未対応 なし | WebView Android 完全対応 44 | Chrome Android 完全対応 44 | Firefox Android 完全対応 51 | Opera Android 未対応 なし | Safari iOS 未対応 なし | Samsung Internet Android 完全対応 4.0 | nodejs 未対応 なし |
凡例
- 完全対応
- 完全対応
- 部分対応
- 部分対応
- 未対応
- 未対応
- 実装ノートを参照してください。
- 実装ノートを参照してください。
- ユーザーが明示的にこの機能を有効にしなければなりません。
- ユーザーが明示的にこの機能を有効にしなければなりません。
- 非標準の名前を使用しています。
- 非標準の名前を使用しています。