はじめに
JavaScriptには、キーと値のペアを扱うための構造として「Object
」と「Map
」があります。一見似ていますが、それぞれに異なる特徴と使いどころがあります。
この記事では、Map
とObject
の違いをコード例とともに整理し、どちらを選ぶべきかを解説します。
1. キーの種類
-
Object
キーとして使えるのは文字列またはシンボルのみ。数値やオブジェクトなどは自動的に文字列に変換されます。const obj = {}; obj[1] = 'one'; // 数値キー → "1"に変換 console.log(obj); // { '1': 'one' }
-
Map
任意のデータ型をキーとして使用できます。オブジェクトや関数もそのままキーにできます。const map = new Map(); map.set(1, 'one'); // 数値 map.set({ key: 'value' }, 'object value'); // オブジェクト
2. キーの順序
-
Object
キーの順序は保証されません。特に数値のような文字列キーは昇順に並び替えられる傾向があります。const obj = { b: 'B', 2: 'two', a: 'A', 1: 'one' }; console.log(obj); // { '1': 'one', '2': 'two', b: 'B', a: 'A' }
-
Map
追加された順番が保持されます。順序が重要なデータ構造に最適です。const map = new Map(); map.set('b', 'B').set(2, 'two').set('a', 'A').set(1, 'one'); console.log([...map.keys()]); // ['b', 2, 'a', 1]
3. イテレーションのしやすさ
-
Object
直接はイテレートできないため、Object.keys()
やObject.entries()
などを介する必要があります。const obj = { a: 1, b: 2 }; for (const key of Object.keys(obj)) { console.log(key, obj[key]); }
-
Map
for...of
でそのままキー・値をイテレーションできます。また、.keys()
や.values()
などの便利メソッドも用意されています。const map = new Map([['a', 1], ['b', 2]]); for (const [key, value] of map) { console.log(key, value); }
4. サイズの取得
-
Object
キー数を取得するにはObject.keys(obj).length
を使います。const obj = { a: 1, b: 2 }; console.log(Object.keys(obj).length); // 2
-
Map
.size
プロパティで簡単にサイズを取得できます。const map = new Map([['a', 1], ['b', 2]]); console.log(map.size); // 2
5. パフォーマンス
-
Object
小規模なデータには問題ありませんが、大量のデータの追加・削除・検索には非効率になることがあります。 -
Map
頻繁にデータを追加・削除するようなケースでは、Map
のほうがパフォーマンスが優れています。
6. 利用できるメソッドの豊富さ
-
Object
hasOwnProperty()
やdelete
演算子程度。操作に柔軟性はあまりありません。 -
Map
以下のような便利なメソッドを提供しています:メソッド 説明 .set()
キーと値の追加・更新 .get()
キーに対応する値を取得 .has()
キーの存在確認 .delete()
特定のキーを削除 .clear()
すべてのキーと値を削除
おわりに
JavaScriptにおけるMap
とObject
の違いは、単なる見た目や構文ではなく、意図と用途の違いに基づいて使い分けることが重要です。
もし「キーが文字列に限られていて、データ数も少ない」ならObject
、それ以外で複雑なロジックや構造を扱うならMap
を検討しましょう。
使い分けの指針
使用シーン | 推奨データ構造 |
---|---|
JSONデータ、設定オブジェクト | Object |
キーが文字列のみ、簡素な構造 | Object |
任意の型をキーに使いたい | Map |
キーの順序を保持したい | Map |
頻繁な追加・削除・検索が発生する | Map |
複雑なデータ構造・キャッシュ用途 | Map |
早見表(比較)
特徴 | Object |
Map |
---|---|---|
キーの種類 | 文字列・シンボルのみ | 任意のデータ型 |
キーの順序 | 保証されない(一部昇順) | 挿入順を保持 |
イテレーション | 間接的 | 直接可能 |
サイズ取得 | Object.keys().length |
.size プロパティ |
操作メソッド | 限定的 | 豊富 |
パフォーマンス | 小規模向き | 大規模データに強い |
継承の影響 | プロトタイプ衝突の恐れ | 衝突なし |