JavaScript

The JavaScript map() method creates a new array by applying a callback to each element, making it a go-to tool for non-mutating transformations.

map

map() は、配列の各要素を「変換して並べ直す」のに使うメソッドで、元の配列を保ったまま新しい配列を作れます。

このページでできるようになること

まずは直感:map() って何?

map() は「配列 → 配列」の変換器です。各要素に関数(コールバック)を適用して、その結果を並べた新しい配列を返します。

最小デモ:まず動かす

配列(数値の並び)を入力して、map() で「変換」してみます。

元の配列:[1, 2, 3, 4]
結果:[2, 4, 6, 8]

※ 変換は「元の配列を作って → map() で新しい配列」を行っています。

JavaScript

const nums = [1, 2, 3, 4];

const doubled = nums.map((value) => {
    return value * 2;
});

console.log(nums);     // [1, 2, 3, 4](元はそのまま)
console.log(doubled);  // [2, 4, 6, 8]

正確な定義(仕様に沿った説明)

何のために存在するか

map() は、配列の各要素にコールバック関数を適用し、その戻り値を並べて新しい配列を作るためのメソッドです。

何に適用されるか(対象)

Array のインスタンスで使えます(例:[].map)。配列に似たもの(NodeList など)は、そのままでは map() が使えないので Array.from() 等で配列化します。

できること / できないこと(制約)

できること
  • 各要素を別の値へ変換し、結果を新しい配列として受け取る
  • コールバックの引数(value / index / array)を使って変換ルールを組み立てる
できないこと(重要)
  • 「絞り込み」を直接すること(それは filter() の仕事)
  • 「要素を1つにまとめる」こと(それは reduce() の仕事)
  • 「副作用だけ」目的での利用(戻り値を使わないなら forEach() が意図に合います)

基本の書き方(最短の型)

最小サンプル(コピペ用)

JavaScript

const out = array.map((value, index, arrayRef) => {
    return value;
});

コールバックの引数は (value, index, array) の順です。必要なものだけ書けばOKです(例:(value) => ...)。

よくあるパターン

数値を加工する
nums.map((n) => n * 2)
オブジェクトからプロパティを抜き出す
users.map((u) => u.name)
index を使う
items.map((v, i) => `${i}: ${v}`)
配列っぽいものを配列化してから map
Array.from(nodeList).map((el) => el.textContent)

仕様として押さえるポイント(初心者が事故りやすい所)

戻り値は「新しい配列」
map() の戻り値は必ず配列です。戻り値を使わないなら map() を選ぶ理由が薄いです。
コールバックが返したものが、そのまま要素になる
よくある事故は「return を忘れて undefined の配列になる」ことです。

JavaScript(悪い例)

const out = [1, 2, 3].map((n) => {
    n * 2; // return していない
});

console.log(out); // [undefined, undefined, undefined]
空要素(sparse)は「呼ばれない」
const a = [1, , 3] のような空要素は、コールバックが実行されません(「undefined が渡される」のとは別)。

JavaScript

const a = [1, , 3];

const out = a.map((v, i) => {
    console.log(i, v);
    return v ?? 0;
});

// 0 1
// 2 3
console.log(out); // [1, <1 empty item>, 3]
thisArg は「this を渡す」第2引数
通常はアロー関数を使うので出番は多くありませんが、function を使うときに this を渡せます。

JavaScript

const ctx = { add: 10 };

const out = [1, 2].map(function (n) {
    return n + this.add;
}, ctx);

console.log(out); // [11, 12]
非同期コールバックは「Promise配列」になる
async 関数を渡すと、戻り値は値ではなく Promise になります。必要なら Promise.all でまとめて待ちます。

JavaScript

const ids = [1, 2, 3];

const promises = ids.map(async (id) => {
    const res = await fetch(`/api/user/${id}`);
    return res.json();
});

const users = await Promise.all(promises);

よくある勘違い・混同ポイント

map() は「処理を回す」メソッド
違います。map() は「新しい配列を作る」ための変換です。戻り値を使わないなら意図が伝わりにくいです。
map() は元配列を絶対に変えない
map() 自体は変えませんが、コールバックが元配列や要素(オブジェクト)を変更すれば結果として変わります。
空要素は undefined と同じ
違います。空要素は「要素が存在しない」状態で、map() はコールバックを呼びません。undefined は「要素は存在して値が undefined」です。
map() と forEach() は同じ
forEach() は戻り値を作りません(常に undefined を返す)。「新しい配列が欲しい」なら map() です。

実務でよくある使用例(制作会社の現場を想定)

APIレスポンスを UI 用の形に整える
バックエンドから来るデータを、表示しやすい形(文字列化、必要プロパティだけ抽出)にします。

JavaScript

const rows = users.map((u) => {
    return {
        id: u.id,
        label: `${u.name}(${u.role})`
    };
});
NodeList を配列化してテキストを抜き出す
DOMの querySelectorAll は NodeList なので、配列へ変換してから map() します。

JavaScript

const texts = Array.from(document.querySelectorAll(".item")).map((el) => {
    return el.textContent?.trim() ?? "";
});
テンプレ用の文字列配列を作る
UIに流し込む前に「表示用の配列」を作っておくと、レンダリング側が単純になります。

JavaScript

const labels = items.map((v, i) => `#${i + 1} ${v}`);

事故と回避(効かない/壊れるの切り分け)

結果が全部 undefined

多くは「return を忘れた」「ブロックボディのアロー関数で戻り値を書いていない」です。式だけなら (n) => n * 2 の形にすると事故が減ります。

元の配列が変わった

オブジェクト要素を破壊的に変更していないか確認します。安全に変換したいなら新しいオブジェクトを作ります({ ...obj })。

非同期で期待した配列が得られない

async コールバックは Promise を返すので、結果は Promise の配列です。必要なら await Promise.all(...) で「値の配列」にします。

A11y / UX(ユーザー体験)

map() は配列変換なので直接A11yを変えるわけではありませんが、「DOMを作るための配列」を作る場面で出番が多いです。

試験で得点できる整理

FAQ

map() と forEach() の違いは?
map() は戻り値として新しい配列を作ります。forEach() は配列を作らず、副作用(DOM更新など)目的に向きます。
空要素と undefined はどう違う?
空要素は「要素が存在しない」ので map() のコールバックが呼ばれません。undefined は「要素は存在し、値が undefined」です。
map(async () => ...) の結果が期待と違います
戻り値が Promise になるので、結果は Promise 配列です。await Promise.all(...) でまとめて待つと値の配列になります。
map() で要素数が変わることはある?
基本的に返る配列の長さは元と同じです(空要素は空要素のまま残る挙動になります)。要素数を変えたいなら filter() や flatMap() を検討します。

まとめ