JavaScriptのMap
の目的、初期化方法、簡単な使い方。
Mapの目的
Object
よりもキーと値の紐付け(マップ)を表すのに適切なオブジェクトを提供することです。MDNのMapが詳しいです。
Mapの初期化
デフォルトコンストラクタMap()
で作成してset
で個別に代入することもできますが、配列リテラルでも初期化できます。
配列リテラルによる初期化
'use strict'
new Map([[0, 0], ["a", "a"], [0.1, 0.1]])
// Map(3) { 0 → 0, a → "a", 0.1 → 0.1 }
Map
の高階関数による処理
Map
の要素を取得するメソッドはentries()
、keys()
、values()
ですが、いずれもイテレーターを返します。現状ではイテレーターはfilter
やmap
のような高階関数を実装しないため、一度Array
に変換してから高階関数を適用する必要があります。
キーがある型の要素からなるMap
を作成する
typeof k === "string"
のstring
を目的の型に置換して別の型でも適用できます。
string型の場合
'use strict'
const m = new Map([[0, 0], ["a", "a"], [0.1, 0.1]])
new Map([...m.entries()].filter(([k, v]) => typeof k === "string"))
// Map { a → "a" }
値がある型の要素からなるMap
を作成する
typeof entry[1] === "string"
のstring
を目的の型に置換して別の型でも適用できます。
string型の場合
'use strict'
const m = new Map([[0, 0], ["a", "a"], [0.1, 0.1]])
new Map([...m.entries()].filter(([k, v]) => typeof v === "string"))
// Map { a → "a" }
値を文字列へ変換したMap
を作成する
'use strict'
const m = new Map([[0, 0], ["a", "a"], [0.1, 0.1]])
new Map([...m.entries()].map(([k, v]) => [k, v?.toString()]))
// Map(3) { 0 → "0", a → "a", 0.1 → "0.1" }
v?.toString()
の?.
は値がundefined
の場合の例外を防ぐために必要です。
値がundefinedの要素を除外したMap
を作成する
'use strict'
// Map(4) { 0 → 0, a → "a", 0.1 → 0.1, undefined → undefined }
const m = new Map([[0, 0], ["a", "a"], [0.1, 0.1], ["undefined", undefined]])
new Map([...m.entries()].filter(([k, v]) => v !== undefined))
// Map(3) { 0 → 0, a → "a", 0.1 → 0.1 }
この投稿の方針
- 辞書の要素は分割代入する。「entry => ...」→「([k, v]) => ...」
- 配列はスプレッド構文で作成する。「Array.from(...)」→「[...x]」