Loading

ROUTE

ルートゼロの
アクティビティ

JavaScript mapの使い方|配列変換の基本

3

mapは「配列を順番に処理するメソッド」とだけ覚えると、forEachやMapオブジェクトとの違いで迷いやすくなります。Array.prototype.mapの要点は、各要素を変換した結果から新しい配列を作ることです。実務で使う形と、つまずきやすいポイントを順に確認します。

まず結論:mapは各要素を変換して新しい配列を返す

MDNではmapは配列の各要素にコールバックを実行し、その結果で新しい配列を作るメソッドとして説明されています。元配列から別の形の配列を作りたい場面に向いています。

const prices = [100, 200, 300];
const taxed = prices.map(price => price * 1.1);

console.log(taxed); // [110, 220, 330]

用語解説:Array.prototype.map
配列の各要素を変換し、その戻り値を要素とする新しい配列を返す標準メソッドです。Mapオブジェクトとは別物です。


1. object配列から必要な値だけ取り出す

APIレスポンスや一覧データでは、object配列から表示用の形へ変換する用途がよくあります。必要なプロパティだけを返すと、後続処理のデータ構造を明確にできます。

const users = [
  { id: 1, name: 'Sato' },
  { id: 2, name: 'Suzuki' }
];

const labels = users.map(user => ({
  value: user.id,
  label: user.name
}));

2. callbackではelement・index・arrayを受け取れる

mapのコールバックには現在の要素、index、元の配列が渡されます。indexは表示番号の作成などに使えますが、Reactのkeyのようにデータ識別子が必要な場面では安定したIDを優先します。

const names = ['A', 'B', 'C'];
const rows = names.map((name, index) => `${index + 1}: ${name}`);

3. 波括弧を使うときはreturnを書き忘れない

アロー関数で波括弧を使う場合、明示的なreturnが必要です。returnを書かないと各要素の結果がundefinedになり、期待した配列になりません。

// NG: 戻り値がない
const a = [1, 2, 3].map(n => {
  n * 2;
});

// OK
const b = [1, 2, 3].map(n => {
  return n * 2;
});

4. mapは副作用だけのために使わない

戻り値の配列を使わず、ログ出力や外部変数の更新だけが目的ならmapよりforEachの方が意図を表しやすくなります。mapは「変換結果を使う」場面に寄せると読みやすくなります。

目的 向いている方法
各要素を別の値へ変換する map
条件に合う要素を残す filter
副作用を伴う反復処理を行う forEach

(filterで条件に合う要素を抽出する方法については『【JavaScript入門】filter関数の使い方とよくあるエラー』をご参照ください)

5. parseIntをmapへ直接渡すときは引数に注意する

mapはコールバックへelementだけでなくindexも渡します。parseIntは第2引数を基数として受け取るため、map(parseInt)のように直接渡すと意図しない結果になります。変換したい値だけを明示的に渡します。

const values = ['10', '20', '30'];
const numbers = values.map(value => Number.parseInt(value, 10));

6. mapメソッドとMapオブジェクトを混同しない

配列のmapメソッドは配列変換のための関数です。一方、Mapはキーと値を保持するコレクションです。名前は同じでも用途が異なります。

(配列・JSON・Mapを含むJavaScriptデータ操作の全体像については『JavaScriptの配列・JSON・map・Map:データ操作術』をご参照ください)

よくある質問

mapは元の配列を変更しますか?

map自体は新しい配列を返します。ただし、要素がobjectで、そのobject自体を直接変更すれば参照先は変わり得ます。必要なら新しいobjectを返します。

mapで条件分岐して要素を除外できますか?

mapは基本的に入力要素ごとに結果要素を作ります。除外が目的ならfilterを組み合わせる方が意図を表しやすくなります。

まとめ:mapは変換結果を使うときに選ぶ

  • mapは新しい配列を返す
  • object配列の整形に使いやすい
  • 波括弧を使うならreturnを忘れない
  • 副作用だけならforEachを検討する
  • parseIntなど複数引数を取る関数の直接渡しに注意する

手元のforループを1つ選び、「各要素を変換して新しい配列を作る処理」ならmapへ書き換えて動きを確認してみてください。

カジュアル面談はこちら

すべてを開示している会社です

ポジティブな面もネガティブな面も、包み隠さず誠実にお答えします。
気になることがあれば、面談の際にすべてオープンにお話します。