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の querySelectorAllNodeList なので、配列へ変換してから 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() を検討します。

まとめ