0
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入門:初心者でもわかる基本操作とReactでの活用法

Posted at

こんにちは!今回は、JavaScript(ES6以降)で利用できるMapについて、初心者向けに解説していきます。
Mapは、キーと値のペアを管理する便利なデータ構造で、従来のObjectやArrayとは異なる特徴を持っています。
この記事では、基本的な使い方やサンプルコード(TypeScriptを使用)を交えながら、ObjectやArrayとの違い、さらにReactでの活用方法についてもご紹介します。


1. Mapの基本とは?

Mapの特徴

  • 任意の型をキーにできる
    Objectの場合、キーは文字列やシンボルに限定されますが、Mapではオブジェクトや関数、数値など、任意の型をキーとして利用可能です。

  • 挿入順が保持される
    Mapはキーと値のペアが追加された順番を保持するため、反復処理を行う際に追加順通りに取り出すことができます。

  • 便利なメソッドが多数用意
    set(), get(), has(), delete(), clear()など、データ操作がシンプルに行えるメソッドが揃っています。

  • サイズの取得が容易
    size プロパティを使用することで、現在格納されている要素数を簡単に取得できます。

基本操作のサンプルコード

// キーがstring、値がnumberのMapを作成
const myMap = new Map<string, number>();

// 要素の追加
myMap.set('apple', 10);
myMap.set('banana', 20);

// 要素の取得
console.log(myMap.get('apple')); // 出力: 10

// キーの存在確認
console.log(myMap.has('banana')); // 出力: true

// 要素の削除
myMap.delete('apple');

// すべての要素を削除
myMap.clear();

// 現在のサイズを確認
console.log(myMap.size); // 出力: 0

2. Objectとの違い

Objectの場合

Objectは一般的にキーとして文字列またはシンボルしか使用できません。
例えば、次のようにオブジェクトをキーとして扱うと、自動的に文字列に変換され、予期せぬ上書きが発生する可能性があります。

const objKey1 = {};
const objKey2 = {};

const obj: { [key: string]: string } = {};
obj[objKey1 as any] = 'value1';
obj[objKey2 as any] = 'value2';

console.log(obj[objKey1 as any]); // 出力: "value2"
// → objKey1とobjKey2はどちらも "[object Object]" という文字列になってしまうため、後から設定した方で上書きされる

Mapの場合

Mapはキーに任意の型を利用できるので、同じオブジェクトをキーとして使っても正しく区別されます。

const objKey1 = {};
const objKey2 = {};

const map = new Map<object, string>();
map.set(objKey1, 'value1');
map.set(objKey2, 'value2');

console.log(map.get(objKey1)); // 出力: "value1"
console.log(map.get(objKey2)); // 出力: "value2"

3. Arrayとの違い

  • Array は「順序付けられた値の集まり」で、各要素にインデックスでアクセスします。
  • Map は「キーと値のペアの集まり」で、任意の型のキーを使って値にアクセスできるため、特定のキーに対する検索や更新が容易です。

用途に応じて、リストとして扱うならArray、キーに基づく検索・管理が必要ならMapを選ぶと良いでしょう。


4. Mapの反復処理

Mapはそのまま for...of ループや forEach メソッドを使って、簡単に反復処理(ループ処理)が行えます。

const numMap = new Map<number, string>([
  [1, 'one'],
  [2, 'two'],
]);

// for...of を利用した反復処理
for (const [key, value] of numMap) {
  console.log(key, value);
}

// forEach を利用した反復処理
numMap.forEach((value, key) => {
  console.log(key, value);
});

5. ReactでのMapの活用例(TypeScript)

Reactコンポーネントの状態(state)としてMapを利用する場合、Map自体がミュータブル(直接変更可能)なため、更新時には新しいMapを作成して状態を更新するのがポイントです。

サンプルコンポーネント:FruitCounter

import React, { useState } from 'react';

const FruitCounter: React.FC = () => {
  // 初期状態として、"apple" が10個のMapを生成
  const [fruitMap, setFruitMap] = useState(new Map<string, number>([['apple', 10]]));

  // フルーツを追加または更新する関数
  const addOrUpdateFruit = (fruit: string, count: number) => {
    // 現在のMapをコピーして更新(ミュータブルなデータを直接更新しない)
    const newMap = new Map(fruitMap);
    newMap.set(fruit, count);
    setFruitMap(newMap);
  };

  return (
    <div>
      <h1>Fruit Counter</h1>
      <button onClick={() => addOrUpdateFruit('banana', 20)}>
        Add/Update Banana
      </button>
      <ul>
        {Array.from(fruitMap.entries()).map(([fruit, count]) => (
          <li key={fruit}>
            {fruit}: {count}
          </li>
        ))}
      </ul>
    </div>
  );
};

export default FruitCounter;

ポイント

  • 新しいMapの作成
    状態更新時に new Map(fruitMap) でコピーを作成し、直接元のMapを変更しないことで、Reactが状態変化を検知しやすくなります。

  • Arrayへの変換
    Mapの entries()Array.from() で配列に変換し、.map() メソッドを利用することで、リスト表示などの処理がシンプルに行えます。


まとめ

JavaScriptのMapは、以下のような点で非常に強力なツールとなります。

  • 柔軟なキーの扱い
    任意の型をキーにできるため、従来のObjectでは難しかった複雑なキー管理が可能です。

  • 挿入順の保持
    反復処理時に追加順序が保証されるため、データの順序性が重要なシーンで有用です。

  • Reactとの相性も良い
    状態管理にMapを使う際は、ミュータブルな特性に注意しながら、新しいMapを生成することで、適切に再レンダリングを促せます。

Mapの特性や使い方を理解することで、より柔軟で効率的なデータ管理が可能になります。ぜひ、日々の開発に取り入れてみてください!


以上、JavaScriptのMapについての解説でした。この記事が皆さんの学習や開発の助けになれば幸いです。
Happy Coding!

0
2
1

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
0
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?