#21 JavaScriptで学ぶコレクション操作の応用(フィルタ・マップ的な考え方)の基本

はじめに

以前の記事「#7 JavaScriptで学ぶ配列の基本」では、配列(複数の値をまとめて扱うための入れ物、これを「コレクション」とも呼びます)の基本操作に軽く触れました。具体的には、条件に合う要素だけを残す filter() と、各要素を加工して新しい配列にする map() の2つです。今回はその発展編として、これらを組み合わせて実務でよく使う書き方や、似たようなメソッドとの使い分けを詳しく見ていきます。

filter・map・reduceをチェーンして使う

実際の開発では、「絞り込み→加工→集計」という一連の流れを一度に書くことがよくあります。例えば、商品データの配列から「在庫がある商品」だけを選び、「税込価格」に変換し、その合計金額を求めてみましょう。

const products = [
  { name: "ノート", price: 100, inStock: true },
  { name: "ペン", price: 50, inStock: false },
  { name: "消しゴム", price: 80, inStock: true },
];

const total = products
  .filter(p => p.inStock)          // 在庫があるものだけ残す
  .map(p => p.price * 1.1)         // 税込価格(10%)に変換
  .reduce((sum, price) => sum + price, 0); // 合計を計算

console.log(total); // 198

reduce()は「複数の値をまとめて1つの値にする」ためのメソッドです。初心者にはやや取っつきにくいですが、合計・最大値・グループ化など応用範囲が広く、ぜひ覚えておきたいメソッドです。第1引数には「コールバック関数(処理のたびに呼び出される関数)」を渡し、その中では「これまでの計算結果(sum)」と「今見ている要素(price)」を受け取れます。第2引数の 0 は計算の初期値です。

このように .filter().map().reduce() とメソッドを「.」でつなげて書くスタイルを「メソッドチェーン」と呼びます。1つの処理ごとに新しい配列(または値)が返されるため、次のメソッドをそのまま続けて呼び出せる仕組みです。

for文で書いた場合との比較

同じ処理をfor文で書くと、次のようになります。

let total2 = 0;
for (let i = 0; i < products.length; i++) {
  if (products[i].inStock) {
    total2 += products[i].price * 1.1;
  }
}

どちらも結果は同じですが、for文は「どうやって(How)処理するか」を1行ずつ細かく指示する書き方(手続き的なスタイル)です。一方、filter・map・reduceを使う書き方は「何を(What)したいか」を並べていくスタイル(宣言的なスタイル)と呼ばれます。ループの制御(添字の初期化や増分など)を自分で書く必要がなく、それぞれのメソッド名から処理の意図が読み取りやすいのが利点です。慣れないうちは読みにくく感じるかもしれませんが、「filterは選ぶ」「mapは変換する」「reduceはまとめる」と役割を意識すると理解しやすくなります。

ただし、配列の要素数が非常に多い場合や、途中で処理を打ち切りたい(例えば最初に条件に合った時点でループを止めたい)場合は、for文やbreakを使った方が効率的なこともあります。

forEachとの使い分け

forEach()も配列の各要素に対して処理を行うメソッドですが、filterやmapとの大きな違いは「戻り値が無い(常にundefinedを返す)」点です。

products.forEach(p => console.log(p.name));

上の例のように、コンソールに出力するだけで新しい配列を作る必要がない場合はforEachが適しています。逆に、新しい配列を作りたい(絞り込みたい・加工したい・まとめたい)場合はfilter・map・reduceを使うのが自然です。「戻り値を使うかどうか」を基準に選ぶと迷いにくくなります。

なお、Pythonのリスト内包表記のように1行で書ける専用構文はJavaScriptにはありませんが、その分メソッドチェーンで処理の流れを段階的に、かつ読みやすく表現できるのがJavaScriptらしい特徴と言えるでしょう。

まとめ

今回は、filter・map・reduceをチェーンして使う実践的な書き方、for文との考え方の違い、forEachとの使い分けを紹介しました。最初はメソッドの名前や引数の意味を覚えるのに苦労するかもしれませんが、「配列から欲しいデータだけを取り出し、形を変え、まとめる」という一連の流れを意識すると、コードの見通しがぐっと良くなります。ぜひ手元のエディタで小さな配列を作り、実際にコードを動かしながら試してみてください。

関連記事


本ページはプロモーションを含みます。

参考書籍(PR)

JavaScriptをもっと学びたい方には「改訂新版JavaScript本格入門」がおすすめです。


PR

コードを書かずに自動化したい方へ

「学んだけど自分の作業に組み込む時間がない」という方向けに、ダブルクリックで動く Windows専用の自動化ツールをオーダーメイドで作成しています。気になる方は こちらをご覧ください。

コメント

このブログの人気の投稿

#25 Rustで学ぶAI API(ChatGPT等)の呼び出し方の基本

#8 C++で学ぶ文字列操作の基本

#16 TypeScriptで学ぶ辞書型(マップ)の基本