1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

オブジェクトとMapの違い

Posted at

はじめに

Mapはオブジェクトと似たようにキーと値のペアを格納できますが、いくつかの重要な違いがあります。

主な違い

1. キーの種類

  • オブジェクト: キーは文字列またはシンボルに限定されます。それ以外のデータ型は文字列に変換されます。
    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');
    console.log(map);
    

2. キーの順序

  • オブジェクト: 挿入順は保証されません。ただし、数値に見えるキーは数値順に並べられます。
    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. パフォーマンス

  • オブジェクト: 小規模なデータでは効率的ですが、大量のデータ操作には不向きです。
  • Map: 大規模なデータセットの頻繁な追加、削除、ルックアップにはより適しています。

4. イテレーション

  • オブジェクト: 直接イテレーションできません。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);
    }
    

5. サイズの取得

  • オブジェクト: サイズを取得するには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
    

6. メソッド

  • オブジェクト: 基本的な操作のみ(プロパティの追加、削除、存在確認)。
  • Map: 豊富なメソッドが用意されています。
    • .set(key, value) - キーと値の追加または更新
    • .get(key) - キーに対応する値を取得
    • .has(key) - キーの存在確認
    • .delete(key) - キーと値の削除
    • .clear() - 全エントリーの削除

7. プロトタイプ継承

  • オブジェクト: Object.prototypeを継承するため、toStringhasOwnPropertyといったメソッドが衝突する可能性があります。
    const obj = {};
    console.log(obj.toString); // [Function: toString]
    
  • Map: プロトタイプの衝突がなく、キーや値が純粋に管理されます。
    const map = new Map();
    console.log(map.toString); // [Function: toString] from Map prototype
    

使い分け

  • Object:
    シンプルな構造で、文字列のキーだけで十分な場合に最適です。
    : エンティティの表現、設定オブジェクト、またはJSON形式のデータ。

  • Map:
    以下のような複雑なユースケースに適しています:

    • キーに任意の型を使用できる必要がある場合。
    • 挿入順序を保持することが重要な場合。
    • 頻繁な追加・削除が必要で、パフォーマンスが重要な場合。
      : キャッシュ、非文字列キーを使った検索処理。

早見表

特徴 オブジェクト Map
キーの種類 文字列/シンボル 任意のデータ型
キーの順序 保証されない(数値キーは順序) 挿入順が保持される
パフォーマンス 小規模データ向け 大規模データ向け
イテレーション 間接的 直接的
サイズの取得 Object.keys()が必要 .sizeプロパティ
メソッド 制限あり 豊富なメソッド
プロトタイプ継承 衝突の可能性あり 衝突なし
1
1
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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?