今回のゴール
Mapとは?を整理して理解する。ふつうのオブジェクトと違う点も列挙。また、使用するにあたっての考慮、あるいは検討する性質について
Mapの性質
Mapは連想配列として認識するとイメージしやすい。ただのオブジェクトより自由度が高い連想配列といえます。始めとして下記にオブジェクトとの違いを箇条書きにして明確にします。
オブジェクトとMapの違いは以下の通りです
キーにstring以外を設定できる。
キーの列挙順が保証されている。
キーの数を取得するためには、Object.keys()を使用する必要がある。
キーと値のペアを保持し、キーが最初に挿入された順序を覚えている。
以上です。
Mapの方はMap<K,V>
のような形をとります。Kにキーの型、Vに値の型を示します。まずMap
の作成方は下記のように記述して初期化します。しかし、このままでは定数map
は<any,any>
となってしまうのでよろしくないでしょう。
const map = new Map();
また、主なメソッドはset,getを使用し、hasというものもある。
set
は下記のように、引数に値をセットしてデータを追加する。
const map: Map<string, number> = new Map();
map.set('a',1);
get
は下記のようにキーを指定して値を返す。ただし、存在しないキーが記述された場合、undefined
が返される。
const map: Map<string, number> = new Map();
map.set('a',1);
console.log(map.get('a')//1
console.log(map.get('bar')//unudifined
存在確認して要素を取得する場合はhasメソッドは認識されない。
const map = new Map([["a", 1]]);
if (map.has("a")) {
// TypeScriptは"a"があることを認識しない
const n = map.get("a");
n * 2;
}
const map = new Map([["a", 1]]);
const n = map.get("a");
if (typeof n === "number") {
n * 2;
}
考慮、検討する点
パフォーマンスを意識するなら、Map
ではなくWeakMap
という手もある。ただし、列挙系は使用できないので、逆に列挙を使用しない場合のみ検討する。Map
はGCの対象にならないため、本来ガベレージコレクトされてもいいオブジェクトも、Map
でキーとして使用されているためメモリ上に残り続ける。以上により場面では、WeakMap
を使用する手もあるだろう。
参考記事