情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

ECMAScript 6の新機能(13)マップ

ECMAScript 6でマップが追加され、Mapクラスとして提供されています。

Mapクラスでは要素のキーとして文字列だけではなく任意の値を指定することができます。

マップの作成

マップを作成するにはMapクラスのコンストラクタを使用します。

C:\work\node>node
> new Map()
Map {}

第1引数に2つの要素を有する配列から成るイテラブルを指定することもできます。この場合、配列の1つ目の要素がマップの要素のキーとなり、2つ目の要素が要素の値となります。

> new Map([['foo', 100], ['bar', 200]])
Map { 'foo' => 100, 'bar' => 200 }

以後Mapクラスのインスタンスをmapと表記します。

要素の追加

マップに要素を追加するにはmap.set関数を使用します。

第1引数に要素のキーを指定します。

第2引数に要素の値を指定します。

> var map = new Map()
undefined
> map.set(77, 'ken')
Map { 77 => 'ken' }
> map.set(777, 'kenn')
Map { 77 => 'ken', 777 => 'kenn' }

ただし、第1引数に既に追加されているキーを指定した場合にはそのキーの要素の値が更新されます。

> map.set(77, 'kan')
Map { 77 => 'kan', 777 => 'kenn' }
> map.set(777, 'kann')
Map { 77 => 'kan', 777 => 'kann' }

値の取得

マップから要素の値を取得するにはmap.get関数を使用します。

第1引数に要素のキーを指定します。

返り値として要素の値が得られます。

> map.get(77)
'kan'
> map.get(777)
'kann'

ただし、第1引数に存在しないキーを指定した場合にはundefinedが返ります。

> map.get(999)
undefined

要素の削除

マップから要素を削除するにはmap.delete関数を使用します。

第1引数に要素のキーを指定します。

返り値として要素が存在していたかが真偽値として得られます。

> map.delete(77)
true
> map.delete(999)
false

要素の存在チェック

マップに要素が存在しているかをチェックするにはmap.has関数を使用します。

第1引数に要素のキーを指定します。

返り値として要素が存在しているかが真偽値として得られます。

> map.has(77)
false
> map.has(777)
true

全ての要素の削除

マップの全ての要素を削除するにはmap.clear関数を使用します。

> map.set(1, 'yan')
Map { 777 => 'kann', 1 => 'yan' }
> map.set(13, 'san')
Map { 777 => 'kann', 1 => 'yan', 13 => 'san' }
> map.clear()
undefined
> map
Map {}

要素数の取得

マップの要素の数を取得するにはmap.sizeを使用します。

> map.size
0
> map.set(1, 'yan')
Map { 1 => 'yan' }
> map.size
1
> map.set(13, 'san')
Map { 1 => 'yan', 13 => 'san' }
> map.size
2

これは関数ではありませんので注意してください

> map.size()
TypeError: map.size is not a function
    at repl:1:5
    at REPLServer.defaultEval (repl.js:272:27)
    at bound (domain.js:280:14)
    at REPLServer.runBound [as eval] (domain.js:293:12)
    at REPLServer.<anonymous> (repl.js:441:10)
    at emitOne (events.js:101:20)
    at REPLServer.emit (events.js:188:7)
    at REPLServer.Interface._onLine (readline.js:224:10)
    at REPLServer.Interface._line (readline.js:566:8)
    at REPLServer.Interface._ttyWrite (readline.js:843:14)

キー

要素のキーが同一のものであるか判定する方法は===演算子の判定方法とほぼ同じですが、NaNNaNと同一であると判定される点のみが異なります。

> NaN === NaN
false
> map.set(NaN, 'nana')
Map { 1 => 'yan', 13 => 'san', NaN => 'nana' }
> map.get(NaN)
'nana'

イテラブル

マップの全ての要素のキーから成るイテラブルを取得するにはmap.keys関数を使用します。

> map.keys()
MapIterator { 1, 13, NaN }

マップの全ての要素の値から成るイテラブルを取得するにはmap.values関数を使用します。

> map.values()
MapIterator { 'yan', 'san', 'nana' }

マップの全ての要素のキーと値の配列から成るイテラブルを取得するにはmap.entries関数を使用します。

> map.entries()
MapIterator { [ 1, 'yan' ], [ 13, 'san' ], [ NaN, 'nana' ] }

また、map自体もマップの全ての要素のキーと値の配列から成るイテラブルです

なお、これらのイテラブルは要素がマップに追加されたのと同じ順序で要素のキーや値を返します。

全ての要素に対する処理

マップの全ての要素に対して処理を行うにはmap.forEach関数を使用します。

第1引数に処理を関数として指定します。

この関数の第1引数は要素の値であり、第2引数は要素のキーであり、第3引数はマップです。

第2引数に第1引数の処理を表す関数の内部におけるthisの値を指定します。この引数は指定しなくても構いません。この引数を指定しなかった場合にはthisの値はundefinedとなります。

> map.forEach(function (value, key, map) {
... console.log(key + ': ' + value);
... })
1: yan
13: san
NaN: nana
undefined
pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-ecmascript 2015, ecmascript 6, Javascript