このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

【JavaScript入門】Map

Map

 JavaScript には、Object と同様に「キーと値のペア」でデータを管理できる構造として Map があります。オブジェクトと似た使い方ができますが、いくつかの特徴によって処理効率や利便性が大きく向上するケースがあり、必要に応じて利用すると便利です。ここでは、Map の基本的な使い方や特性を見ていきます。

1.Map が Object と異なる点

  • キーにあらゆる値を使える。
    オブジェクトのプロパティ名は文字列が主体ですが、Map のキーには数値やオブジェクトなど多様な型を使うことができます。
  • キーと値の順序が保持される。
    データを追加した順番を記憶しているため、取り出すときにも同じ順序で列挙できます。
  • サイズ(要素数)を簡単に取得できる。
    .size プロパティで現在の要素数をすぐにわかります。
  • 反復処理が直接可能
    myMap.forEach()for...of などを使って要素を順序どおりに処理でき、キーや値を簡単に列挙できます。
  • 性能面で有利な場合がある。
    特に多くの要素を追加・削除・検索するケースでは、Map がより効率的に動作することがあります。

2.基本的な使い方

2.1. Map を作成

new Map() を呼び出すと、空の Map インスタンス(オブジェクト)を作成します。

const myMap = new Map();

2.2. 要素の追加・取得

set() メソッドでデータを追加(キーと値を設定)し、get() メソッドで取得します。

myMap.set('coffee', 'コーヒー');
myMap.set('tea', '紅茶');

console.log(myMap.get('coffee')); // "コーヒー"

2.3. 要素のチェック・削除

has() でキーの存在を確認し、delete() で削除できます。

console.log(myMap.has('tea')); // true
myMap.delete('tea');
console.log(myMap.has('tea')); // false

2.4. 要素の個数

size プロパティで要素数を返します。

console.log(myMap.size); // 1

3.繰り返し処理

 Map は直接繰り返し処理に対応しているため、forEach()for...of で要素を簡単に列挙できます。

// forEach(): 第1引数は値, 第2引数はキー
myMap.forEach((value, key) => {
  console.log(key, '=>', value);
});

// for...of: entries() で [キー, 値] ペアを順番に取得
for (const [key, value] of myMap.entries()) {
  console.log(key, '=>', value);
}

4.マップの初期化

 new Map() の引数に [キー, 値] の配列を要素とする配列を渡すことで、最初から複数のデータをまとめて登録することも可能です。

const anotherMap = new Map([
  ['apple', 'りんご'],
  ['banana', 'バナナ'],
  ['grape', 'ぶどう']
]);

5.サンプルコード(HTML + JavaScript)

 次の例を「myMapSample.html」というファイル名で保存し、ブラウザで開いて開発者ツール(コンソール)を確認してください。

myMapSample.html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>myMapSample.html</title>
</head>
<body>
  <h1>Map のサンプル</h1>
  <p>ブラウザのコンソールを開いて出力結果を確認してください。</p>

  <script>
    // 1. Map の作成と初期化
    const myMap = new Map();
    myMap.set('coffee', 'コーヒー');
    myMap.set('tea', '紅茶');
    myMap.set('cookie', 'クッキー');

    console.log('サイズ:', myMap.size); // 3

    // 2. 値の取得
    console.log('coffee:', myMap.get('coffee')); // "コーヒー"

    // 3. すべてのキーと値を出力
    myMap.forEach(function(value, key) {
      console.log('forEach ->', key, ':', value);
    });

    // 4. 要素を削除
    console.log('delete("tea"):', myMap.delete('tea'));
    console.log('has("tea"):', myMap.has('tea')); // false

    // 5. 配列でマップを初期化
    const fruitMap = new Map([
      ['orange', 'オレンジ'],
      ['grape', 'ブドウ'],
      ['melon', 'メロン']
    ]);
    console.log('fruitMap size:', fruitMap.size); // 3
    console.log('fruitMap entries:');
    for (const [key, value] of fruitMap) {
      console.log(key, '->', value);
    }
  </script>
</body>
</html>

実行結果

デバッグコンソールの出力

サイズ: 3
coffee: コーヒー
forEach -> coffee : コーヒー
forEach -> tea : 紅茶
forEach -> cookie : クッキー
delete("tea"): true
has("tea"): false
fruitMap size: 3
fruitMap entries:
orange -> オレンジ
grape -> ブドウ
melon -> メロン

まとめ

  • MapObject と同様にキーと値を管理するが、キーとしてあらゆる型が使えたり、データの挿入順を保持したり、size で簡単に要素数が得られるなどの特徴がある。
  • 大量のデータを頻繁に追加・削除・検索するシーンでは Map が便利な場合が多い。
  • forEach()for...of などを使って、簡単に全要素を列挙できる。

 必要に応じて Map を使うことで、オブジェクトよりもスッキリしたコードを書ける場面があるので、状況に応じて使い分けを覚えておくと便利です。