object.forEachと書きたいが…
Objectは直接forEachできないため、以下のように書く必要がある。
Object.keys(obj).forEach(key=>{/*keyを使った処理*/})
これでもいいのだが、連想配列にはObjectだけでなくMapも利用できるので、試してみよう。
Map型を使った場合
Mapを使った場合は以下のように書ける。
map.forEach((value, key)=>{/*keyとvalueを使った処理*/})
Map.prototypeから直接forEachが生えているので、若干短く書ける。
他にもMap型から直接使えるメソッドがあり、
map.keys() //keyを列挙するイテレータを取得
map.values() //valueを列挙するイテレータを取得
などが該当する。
ちなみに、for文で処理することも可能。
for (const [key, value] of map) {
//keyとvalueを使った処理
}
ObjectとMapの相互変換
以下のようにして相互に変換できる。
//Map→Object
const obj = Object.fromEntries(map.entries())
//Object→Map
const map = new Map(Object.entries(obj))
//ちなみにMap→Arrayは
const array = [...map]
//Array→Map
const map = new Map(array)
Object.entries/Object.fromEntriesというドンピシャな関数が用意されているので、有り難く使わせてもらおう。
余談
そのうちmap.map((val, key)=>…)
なんて登場するんじゃないかと思っていたが、どうも[...map].map(([key, val])=>…)
で済むらしい。
参考文献
MDN Map - ObjectとMapの比較
MDN Map.prototype.forEach()