ARRAY METHOD

Array.prototype.map()

配列の一つひとつを同じルールで変換し、その結果を新しい配列として受け取りたいときに使います。 元の配列はそのままなので、変換前と変換後を安心して見比べられます。

TRY IT

遊んでみよう

数値と変換ルールを変えて、元の配列と新しい配列を見比べてみましょう。

元の配列

各要素は -100〜100 の数値に制限しています。

入力・元の配列[1, 2, 3, 4]変わらない
出力・新しい配列[2, 4, 6, 8]新しく作られる
実行できるコード
const numbers = [1, 2, 3, 4];
const mapped = numbers.map((number) => number * 2);

console.log(mapped); // [2, 4, 6, 8]
console.log(numbers); // [1, 2, 3, 4]

NAME

mapの意味

map /mæp/

英語の map には「対応づける」という意味があります。JavaScriptでは、元の配列の各要素を 別の値へ1対1で対応づけ、新しい配列を作るイメージです。

SYNTAX

構文

array.map(callbackFn)
array.map(callbackFn, thisArg)
map()の引数
名前省略説明・既定値
callbackFn関数不可各要素に対して呼ばれ、返した値が新しい配列の要素になります。
thisArg任意コールバック内の this に使う値。既定値は undefined です。

callbackFnが受け取る3つの値

  • element(任意の型): 現在処理している要素
  • index(number): 現在の要素の位置番号。先頭は 0
  • array(Array): map() を呼び出した元の配列
const labels = [10, 20, 30].map((element, index, array) => {
  return `${index + 1}/${array.length}: ${element}`;
});

console.log(labels); // ["1/3: 10", "2/3: 20", "3/3: 30"]

RETURN VALUE

戻り値と元の配列

戻り値

型は Array。コールバックの返り値を順番に並べた、新しい配列です。空配列なら空配列を返します。

元の配列

map() 自体は元の配列を変更しません。ただし、コールバック内でオブジェクトを変更すると、その変更は共有された参照へ反映されます。

QUICK REFERENCE

早見表

目的配列のすべての要素を変換する
返すもの変換結果を入れた新しい配列
元の配列map() 自体は変更しない
コールバック回数値がある各要素につき1回
空配列コールバックを呼ばず [] を返す
配列の長さ疎配列を含め、基本的に元の配列と同じ長さ

EXAMPLES

よくある使い方

数値を計算する

const prices = [100, 250, 400];
const taxIncluded = prices.map((price) => Math.round(price * 1.1));

console.log(taxIncluded); // [110, 275, 440]

オブジェクトから値を取り出す

const users = [{ name: "Aki" }, { name: "Mio" }];
const names = users.map((user) => user.name);

console.log(names); // ["Aki", "Mio"]

位置番号を使う

const tasks = ["読む", "書く"];
const numbered = tasks.map((task, index) => `${index + 1}. ${task}`);

console.log(numbered); // ["1. 読む", "2. 書く"]

CAUTIONS

例外と注意点

callbackFn は必須

コールバックを渡さない、または関数ではない値を渡すと TypeError が発生します。nullundefined に対して呼び出すこともできません。

コールバックでは値を返す

return を忘れると、その位置には undefined が入ります。処理だけを行い戻り値を使わないなら、forEach() の方が意図が伝わります。

疎配列の空きはそのまま

値が存在しないスロットではコールバックが呼ばれず、戻り値にも同じ位置の空きが残ります。

const sparse = [1, , 3];
const mapped = sparse.map((value) => value * 2);

console.log(mapped);      // [2, empty, 6]
console.log(1 in mapped); // false

RELATED

REFERENCES

詳しい資料