mozilla
Your Search Results

    Map

    This translation is incomplete. Please help translate this article from English.

    これは Harmony(ECMAScript 6) 提案の一部であり、実験段階の技術です。
    この技術の仕様は安定していません。ブラウザ互換性の一覧表を確認してください。またこれらの構文や動作は、仕様変更などにより、新しいバージョンのブラウザでは変更される可能性があるという点に注意してください。

    概要

    Map オブジェクトは単純なキー/値写像(マップ)です。キーあるいは値として任意の値(オブジェクト、プリミティブ値とも)を使うことができます。

    構文

    new Map([iterable])
    

    引数

    iterable
    要素がキー・値の対(2 要素の配列)である Array または他の反復処理可能なオブジェクトです。それぞれのキー・値対が新しい Map に追加されます。

    解説

    Map オブジェクトはその要素について挿入順で反復処理を行うことができます。for..of ループは各処理で [キー, 値] の配列を返します。

    キーの等価性

    キーの等価性は「same-value」アルゴリズムに基づきます:NaNNaN と同一(NaN !== NaN にもかかわらず)と見なされ、他のすべての値は === 演算子の動作に従って等しいと見なされます。ECMAScript 6 ドラフトの以前の版では -0+0 は異なる(-0 === +0 にもかかわらず)と見なされていましたが、後の版で変更され、Gecko 29 (Firefox 29 / Thunderbird 29 / SeaMonkey 2.26) (バグ 952870) と最近の nightly Chrome で適用されています。

    オブジェクトとマップの比較

    ObjectMap は、両者とも値へのキーを設定したり、それらの値を取り出したり、キーを削除したり、また何かがあるキーに格納されているかを判定したりすることができるという点で似ています。このため、歴史的に ObjectMap として使われてきました。しかし、Map の使用を望ましくする ObjectMap 間の重要な違いが存在します。

    • Object はプロトタイプを持つため、既定のキーがマップ中に存在します。しかし、これは map = Object.create(null) を使うことで回避することができます。
    • Object のキーは String ですが、Map では任意の値がキーとなり得ます。
    • Map の大きさは簡単に得ることができます。一方、Object の大きさは手動で記録する必要があります。

    キーが実行時まで不明なとき、またすべてのキーの型が同じでかつすべての値の型が同じときは、オブジェクトよりマップを使いましょう。

    個々の要素に影響する論理があるときはオブジェクトを使いましょう。

    プロパティ

    Map.length
    length プロパティの値は 1 です。
    Map.prototype
    Map コンストラクタのプロトタイプを示します。すべての Map オブジェクトに対するプロパティの追加を可能にします。

    Map インスタンス

    すべての Map インスタンスは Map.prototype を継承します。

    プロパティ

    Map.prototype.constructor
    Returns the function that created an instance's prototype. This is the Map function by default.
    Map.prototype.size
    Returns the number of key/value pairs in the Map object.

    メソッド

    Map.prototype.clear()
    Removes all key/value pairs from the Map object.
    Map.prototype.delete(key)
    Removes any value associated to the key. Map.prototype.has(key) will return false afterwards.
    Map.prototype.entries()
    Returns returns a new Iterator object that contains an array of [key, value] for each element in the Map object in insertion order.
    Map.prototype.forEach(callbackFn[, thisArg])
    Calls callbackFn once for each key-value pair present in the Map object, in insertion order. If a thisArg parameter is provided to forEach, it will be used as the this value for each callback.
    Map.prototype.get(key)
    Returns the value associated to the key, or undefined if there is none.
    Map.prototype.has(key)
    Returns a boolean asserting whether a value has been associated to the key in the Map object or not.
    Map.prototype.keys()
    Returns returns a new Iterator object that contains the keys for each element in the Map object in insertion order.
    Map.prototype.set(key, value)
    Sets the value for the key in the Map object. Returns the Map object.
    Map.prototype.values()
    Returns returns a new Iterator object that contains the values for each element in the Map object in insertion order.

    Map オブジェクトの使用

    var myMap = new Map();
    
    var keyObj = {},
        keyFunc = function () {},
        keyString = "文字列";
    
    // 値を設定する
    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("a string");   // "'文字列' と関連付けられた値"
                             // 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) {
      alert(key + " = " + value);
    }
    // 2 回警告を表示する。最初は "0 = zero" で 2 回目は "1 = one"
    
    for (var key of myMap.keys()) {
      alert(key);
    }
    // 2 回警告を表示する。最初は "0" で 2 回目は "1"
    
    for (var value of myMap.values()) {
      alert(value);
    }
    // 2 回警告を表示する。最初は "zero" で 2 回目は "one"
    
    for (var [key, value] of myMap.entries()) {
      alert(key + " = " + value);
    }
    // 2 回警告を表示する。最初は "0 = zero" で 2 回目は "1 = one"
    
    myMap.forEach(function(value, key, myMap) {
      alert(key + " = " + value);
    })
    // 2 回警告を表示する。最初は "0 = zero" で 2 回目は "1 = one"
    

    Array オブジェクトとの関係

    var kvArray = [["キー1", "値1"], ["キー2", "値2"]];
    
    // 通常の Map コンストラクタを使って、キー・値の 2 次元配列をマップに変換する
    var myMap = new Map(kvArray);
    
    myMap.get("キー1"); // "値1" を返す
    
    // 展開演算子を使って、マップをキー・値の 2 次元配列に変換する
    alert(uneval([...myMap])); // kvArray とまったく同じ Array を表示する
    
    // あるいは展開演算子をキーまたは値のイテレータに使って、キーまたは値のみの配列を得る
    alert(uneval([...myMap.keys()])); // Will show ["key1", "key2"]
    

    標準仕様

    仕様書 策定状況 コメント
    ECMAScript 6 (ECMA-262)
    The definition of 'Map' in that specification.
    ドラフト 初期定義。

    ブラウザ互換性

    Help improve compatibility tables by filling out this 11 question survey.

    機能 Chrome Firefox (Gecko) Internet Explorer Opera Safari
    基本サポート

    31 [1]
    38

    13 (13) 11 未サポート 7.1
    コンストラクタ引数:new Map(iterable) 38 13 (13) 未サポート 未サポート 未サポート
    反復処理可能 38 17 (17) 未サポート 未サポート 7.1
    Map.clear() 31 [1]
    38
    19 (19) 11 未サポート 7.1
    Map.keys(), Map.values(), Map.entries() 37 [1]
    38
    20 (20) 未サポート 未サポート 7.1
    Map.forEach() 36 [1]
    38
    25 (25) 11 未サポート 7.1
    -0 と 0 のキー等価性 34 [1]
    38
    29 (29) 未サポート 未サポート 未サポート
    機能 Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
    基本サポート 未サポート 31 [1]
    38
    13.0 (13) 未サポート 未サポート iOS 8
    コンストラクタ引数:new Map(iterable) 未サポート 38 13.0 (13) 未サポート 未サポート 未サポート
    反復処理可能 未サポート 未サポート 17.0 (17) 未サポート 未サポート iOS 8
    Map.clear() 未サポート 31 [1]
    38
    19.0 (19) 未サポート 未サポート iOS 8
    Map.keys(), Map.values(), Map.entries() 未サポート 37 [1]
    38
    20.0 (20) 未サポート 未サポート iOS 8
    Map.forEach() 未サポート 36 [1]
    38
    25.0 (25) 未サポート 未サポート iOS 8
    -0 と 0 のキー等価性 未サポート 34 [1]
    38
    29.0 (29) 未サポート 未サポート 未サポート

    [1] 設定により使用可能です。chrome://flags において「JavaScript の試験運用機能を有効にする」エントリーを有効化します。

    関連情報

    ドキュメントのタグと貢献者

    Contributors to this page: ocha
    最終更新者: ocha,