配列を変換する・絞り込む — map と filter

ループで書いていた「新しい配列を作る」処理を map と filter に置き換えます。繋げて書く方法、元の配列が変わらないこと、途中で空になっても落ちない理由まで確かめます。

実行して検証済み処理系Node 22.22.3対応ES5難易度●●○○○目安9更新

前回for...of で1つずつ処理しました。 今回は、その中でも特に多い「全部に同じ加工をして、新しい配列を作る」を短く書きます。

ループで書くとこうなる

値段の配列から、税込み価格の配列を作ります。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 110, 220, 330 ]
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 110, 220, 330 ]

やっていることは3つです。空の配列を用意し、回して、push() する。 この形はとても多く出てくるので、専用の書き方があります。

map なら1行

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 250, 400 ] [ 100, 250, 80, 400 ]
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 275, 440 ]

map() は、1つ1つを関数に通して、その戻り値を集めた新しい配列を返します。 空の配列も push() も要りません。

上のコードは書き換えて実行できます。* 1.1* 1.3 にしてみてください。

要素の数は変わりません。 3件入れたら3件返ります。

filter で絞る

数を減らしたいときは filter() です。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 100, 250, 80 ]
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 200, 500, 160 ]

filter() に渡す関数は、残すかどうかを返します。 true になった要素だけが集まります。

何をするか 要素の数
map() 変換する 変わらない
filter() 絞る 減ることがある

変換と絞り込みは別の仕事です。 map() で要素を減らすことはできません。

繋げて書く

map()filter()配列を返すので、そのまま次に繋げられます。 これをメソッドチェーンと呼びます。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[] 0
javascript
const prices = [100, 200];

const withTax = prices.map(price => {
Math.round(price * 1.1);
});

console.log(withTax);
[ undefined, undefined ]

絞ってから変換するほうが、変換の回数が減ります。 上の例では4件のうち2件しか計算していません。

読むときは上から順に追ってください。「200円以上を残して、税込みにする」と読めます。

元の配列は変わらない

map()filter()非破壊的メソッドです。 前回出てきた push()pop() とは違います。

呼んだだけでは何も起きません戻り値を受け取る必要があります。

途中で空になっても落ちない

filter() が1件も残さなかったとき、返るのは空の配列です。 null ではないので、そのまま次に繋げても止まりません。

第1回で見た「範囲の外を読むと undefined」とは違い、ここは安全です。 繋げた先で落ちる心配をしなくて構いません。

よくある間違い

{} で囲んだのに return を書き忘れると、全部 undefined になります

エラーになりません。静かに undefined が並びます{} を外すか、return を書けば直ります。

まとめ

  • map() … 1つ1つを変換して新しい配列を作る。数は変わらない
  • filter() … 残すものを選ぶ。数は減ることがある
  • どちらも元の配列を変えない。戻り値を受け取る
  • 繋げられる。絞ってから変換すると無駄が少ない
  • 途中で空になっても空配列が返るので落ちない

この連載はここまで

配列を作り、取り出し、繰り返し、変換するところまで来ました。 ここから先は、必要になったときに引ける形でまとめてあります。

この記事の根拠

  1. Array.prototype.map — ECMAScript® 2026 Language Specificationtc39.es
  2. Array.prototype.filter — ECMAScript® 2026 Language Specificationtc39.es

掲載しているコード例は、公開前に読み手が押したときに動くのと同じもので実行して出力を突き合わせています。結果はリポジトリに残しています。

このページの原文(Markdown)