【ITニュース解説】Mastering Map and Set in JavaScript
2025年09月12日に「Dev.to」が公開したITニュース「Mastering Map and Set in JavaScript」について初心者にもわかりやすく解説しています。
ITニュース概要
JavaScriptのMapとSetは、ES6で導入された新しいデータ構造だ。Mapはどんな型でもキーにできる「キーと値のペア」を順序通りに保存し、Setは重複しないユニークな値だけを順序通りに保存する。これらを使いこなすと、オブジェクトや配列よりも効率的で柔軟なコードが書ける。
ITニュース解説
JavaScriptでプログラムを書く際、データをどのように整理し、扱うかは非常に重要だ。従来、JavaScriptにはデータの集合を扱うための主要な方法として「オブジェクト」と「配列」があった。しかし、JavaScriptのES6(ECMAScript 2015)と呼ばれるバージョンで、これらの既存のデータ構造を補完し、特定の状況でより強力な機能と柔軟性を提供する新しいデータ構造「Map(マップ)」と「Set(セット)」が導入された。
まず、Mapについて解説しよう。Mapはキーと値のペアを格納するためのデータ構造だ。これは従来のJavaScriptオブジェクトと似ているように思えるかもしれないが、Mapにはいくつかの重要な違いとメリットがある。
Mapの大きな特徴の一つは、キーの型に制限がない点だ。従来のオブジェクトでは、キーは基本的に文字列かSymbol(シンボル)に限定されていた。例えば、数値をキーとして使っても、内部的には文字列に変換されてしまう。しかし、Mapでは、文字列だけでなく、数値、真偽値、さらにはオブジェクトそのものや関数までもキーとして使うことができる。これにより、より複雑なデータ構造を柔軟に表現できる。例えば、あるオブジェクトを別のオブジェクトのデータと紐付けたい場合など、Mapを使うと直接的にそのオブジェクトをキーとして扱えるため、プログラムの意図がより明確になる。
次に、Mapは要素が追加された順序を記憶している。これは、Mapが「反復可能(Iterable)」なオブジェクトであることを意味し、要素を追加した順にアクセスしたり、処理したりできる。従来のオブジェクトでは、キーの順序が保証されない場合があったため、この挿入順序の保持は大きな利点だ。
また、Mapに格納されている要素の数を簡単に確認できることも特徴だ。Mapにはsizeというプロパティがあり、これにアクセスするだけで、現在の要素数をすぐに取得できる。従来のオブジェクトでは、キーの数を数えるには特別な関数を使う必要があったため、これはコードの簡潔さに貢献する。
さらに、パフォーマンスの面でもMapは優れている。大量のキーと値のペアを頻繁に追加、削除、検索するような場面では、Mapは従来のオブジェクトよりも効率的に動作するように設計されている。
Mapの基本的な使い方を見てみよう。まず、new Map()と書くことで新しいMapインスタンスを作成する。要素を追加するにはset()メソッドを使う。例えば、map.set('キー1', '値1')と書けば「キー1」に「値1」が関連付けられる。前述のように、map.set(42, '値2')のように数値をキーにしたり、map.set({a: 1}, '値3')のようにオブジェクトをキーにすることも可能だ。保存された値を取得するにはget()メソッドを使い、map.get('キー1')と書けば対応する値が返される。Mapから要素を削除したい場合はdelete()メソッドにキーを渡すことで、そのキーと値のペアを削除できる。特定のキーがMap内に存在するかどうかを確認するにはhas()メソッドを使い、map.has(42)のように記述する。Map内のすべての要素を順番に処理したい場合はforEach()メソッドが便利で、Mapに格納されているキーと値の両方を順番に取り出して処理できる。
次に、Setについて解説しよう。Setは、重複しない一意の値を集めて保存するためのデータ構造だ。これは配列と似ているが、最も重要な違いは「重複する値を許さない」という点だ。Setに同じ値を追加しようとしても、それは無視され、Setの要素数は増えない。
Setの主要な特徴は、その名の通り、すべての値が一意であることだ。もしSetにすでに存在する値を追加しようとしても、Setはそれを無視し、重複した値が格納されることはない。これは、データの重複を自動的に排除したい場合に非常に役立つ。
SetもMapと同様に、あらゆる型の値を格納できる。数値、文字列、オブジェクトなど、JavaScriptで扱えるほとんどすべての値をSetの要素として追加できる。そして、Mapと同じく、Setも要素が追加された順序を記憶している。これにより、Set内の要素を挿入順に反復処理できる。
Setの基本的な使い方を見てみよう。新しいSetインスタンスはnew Set()と書くことで作成する。要素を追加するにはadd()メソッドを使う。例えば、set.add(1)、set.add(2)、set.add('Hello')のように値を追加できる。もしset.add(2)と再度追加しようとしても、Setにはすでに2が存在するため、この操作は無視され、Setの要素数は変わらない。Setの要素数もMapと同様にsizeプロパティで簡単に確認できる。Setから特定の値を削除するにはdelete()メソッドを使い、set.delete(1)と書けば値1が削除される。Set内に特定の値が存在するかを確認するにはhas()メソッドを使い、set.has(1)のように記述する。Set内のすべての要素を順番に処理したい場合はforEach()メソッドを使用し、各値を順番に取り出して処理できる。
MapとSetは、実際のプログラミングにおいて非常に役立つ場面が多い。特にSetの強力な活用例として、配列から重複する値を取り除く方法が挙げられる。例えば、[1, 2, 2, 3, 4, 4, 5]という重複を含む数値の配列があるとする。この配列をnew Set(numbers)のようにSetのコンストラクタに渡すと、Setは自動的に重複を排除し、{1, 2, 3, 4, 5}という一意の値の集合を作り出す。さらに、このSetをスプレッド構文(...)を使って[...new Set(numbers)]のように配列に展開し直すことで、簡単に重複のない新しい配列[1, 2, 3, 4, 5]を作成できる。これは、従来のJavaScriptで配列の重複を排除しようとすると、ループ処理や一時的なオブジェクトを使うなど、より多くのコードと手間が必要だったことを考えると、非常に簡潔で効率的な方法だ。
まとめると、MapとSetはJavaScriptの強力な新しいデータ構造であり、従来のオブジェクトや配列では扱いにくかった特定の種類のデータ管理を、より柔軟かつ効率的に行うことができる。Mapはキーの型に制約がなく、挿入順序を保持するキーと値のペアのコレクションとして、オブジェクトでは実現が難しかった複雑なマッピングを実現する。一方、Setは重複しない値のコレクションとして、データのユニーク性を保証し、配列からの重複排除といった処理を劇的に簡素化する。これらのデータ構造を理解し、適切に使いこなすことで、より効率的で読みやすく、そして強力なJavaScriptコードを書くことができるようになるだろう。