0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

TypeScriptのMapを整理してみた

Posted at

今回のゴール

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を使用する手もあるだろう。

参考記事

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?