1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

JavaScriptの`Map`と`Object`の違いと使い分け

Last updated at Posted at 2025-01-20

はじめに

JavaScriptには、キーと値のペアを扱うための構造として「Object」と「Map」があります。一見似ていますが、それぞれに異なる特徴と使いどころがあります。

この記事では、MapObjectの違いをコード例とともに整理し、どちらを選ぶべきかを解説します。

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におけるMapObjectの違いは、単なる見た目や構文ではなく、意図と用途の違いに基づいて使い分けることが重要です。
もし「キーが文字列に限られていて、データ数も少ない」ならObject、それ以外で複雑なロジックや構造を扱うならMapを検討しましょう。

使い分けの指針

使用シーン 推奨データ構造
JSONデータ、設定オブジェクト Object
キーが文字列のみ、簡素な構造 Object
任意の型をキーに使いたい Map
キーの順序を保持したい Map
頻繁な追加・削除・検索が発生する Map
複雑なデータ構造・キャッシュ用途 Map

早見表(比較)

特徴 Object Map
キーの種類 文字列・シンボルのみ 任意のデータ型
キーの順序 保証されない(一部昇順) 挿入順を保持
イテレーション 間接的 直接可能
サイズ取得 Object.keys().length .size プロパティ
操作メソッド 限定的 豊富
パフォーマンス 小規模向き 大規模データに強い
継承の影響 プロトタイプ衝突の恐れ 衝突なし
1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?