1. 作品 5 件をすべて変換する
  2. 作品 2 件を変換する
  3. 表示回数が 0 の作品も変換できる
  4. 空配列なら空配列を返す
コース一覧
モダンJavaScript:データ処理とコード設計
map で形を変える

モダンJavaScript:データ処理とコード設計

配列の map・filter・reduce・sort、クロージャと高階関数、オブジェクトとクラス、エラー設計、正規表現を学ぶ全 36 レッスン(665 分)のコースです。ローカルの作品データを題材に、表示とデータを分け、絞り込み・並び替え・入力検証までを組み立てます。Promise、fetch、API 通信、モジュールは次のコースで扱います。

1
土台をそろえる
01. このコースで育てるもの15分
02. strict mode が先に教えてくれる間違い15分
03. 表示とデータを切り分ける20分
04. 第1章まとめクイズ10分
2
配列をパイプラインで扱う
01. map で形を変える20分
02. filter と find で絞り込む20分
03. reduce でひとつにまとめる20分
04. sort と比較関数20分
05. 分類してまとめる groupBy20分
06. つなげて組み立てる20分
07. つくる 作品一覧の絞り込みと並び替え30分
08. 第2章まとめクイズ10分
3
関数を道具にする
01. クロージャで状態を閉じ込める20分
02. 設定を覚えた関数をつくる20分
03. 関数を返す関数20分
04. 副作用のない関数20分
05. 第3章まとめクイズ10分
4
オブジェクトを扱いきる
01. 分割代入で必要な値だけ取り出す20分
02. スプレッドとレストで組み替える20分
03. keys と values と entries20分
04. ビット演算でフラグをまとめる20分
05. 第4章まとめクイズ10分
5
クラスで型をつくる
01. クラスとインスタンス20分
02. private フィールドとアクセサ20分
03. 継承と super20分
04. 多態と static20分
05. つくる 作品コレクションをクラスにする30分
06. 第5章まとめクイズ10分
6
エラーを設計する
01. try catch finally20分
02. 自分でエラーを投げる20分
03. 失敗を画面に出す25分
04. 第6章まとめクイズ10分
7
正規表現
01. 正規表現のきほん20分
02. 入力を検証する20分
03. 置換とキャプチャ20分
04. 第7章まとめクイズ10分

map で形を変える

map は 1 件を 1 件に変える
解説

このレッスンで分かること

  • forEach は何も返さず、map は変換した結果を集めた新しい配列を返します
  • map は件数を減らせません。出てくる配列の長さは必ず元と同じです

入れ物を用意して push するのをやめる

入門では一覧を forEach で組み立てました。forEach は 1 件ずつ関数を呼ぶだけで、呼び出した側には何も返しません。だから結果をどこかに置いておくには、外側に空の配列を用意して push する必要がありました。

JavaScript

const skills = [ { name: "CSS", years: 2 }, { name: "JavaScript", years: 1 } ]; const lines = []; skills.forEach((skill) => { lines.push(skill.name + " (" + skill.years + ")"); });

map を使うと、入れ物の用意と push が消えます。渡した関数が return した値が、そのまま新しい配列の同じ位置に入るからです。

JavaScript

const lines = skills.map((skill) => skill.name + " (" + skill.years + ")"); // ["CSS (2)", "JavaScript (1)"]

行数が減っただけに見えますが、変わったのは意味のほうです。forEach は「何かをする」としか言っていません。map は「元の配列から新しい配列を作る」とはっきり言っています。読む人は中身を追わなくても、元と同じ件数の配列が出てくることを先に知ることができます。

forEachmap
戻り値undefined新しい配列
向いている仕事画面に出すなど結果を残さない処理表示用の形に変換して受け取る処理

forEach の中で return を書いても、その値はどこにも行きません。行くのは「その 1 件の処理を打ち切る」という意味だけです。値がほしいと思った時点で map に持ち替えます。

件数は必ず同じになる

map のいちばん大事な性質は、出てくる配列の長さが元と必ず同じになることです。5 件を渡せば 5 件返ります。ここで「公開されているものだけにしたい」と思っても、map では減らせません。

JavaScript

// これは意図どおりに動かない const titles = works.map((work) => { if (work.published) { return work.title; } }); // 非公開の位置に undefined が残り、件数は減らない

長さが必ず同じ、という性質には利点もあります。元の配列の 3 番目と、結果の 3 番目は必ず同じものを指しています。添字で対応が取れるので、別々に作った配列をあとから突き合わせられます。減らす処理を混ぜた瞬間にこの対応は崩れるので、map は形を変えるだけ、と役割を決めておくのが得だということです。

オブジェクトを返すときは丸かっこで包む

アロー関数を短い形で書くとき、そのまま波かっこを書くと関数の本体だと解釈されます。オブジェクトを返したいときは丸かっこで包みます。

JavaScript

// 波かっこが本体と見なされ、undefined が並ぶ const bad = skills.map((skill) => { name: skill.name }); // 丸かっこで包むとオブジェクトが返る const good = skills.map((skill) => ({ name: skill.name, years: skill.years }));

この書き方は、表示に必要な項目だけを持つ軽い形を作るときによく使います。元のデータは画面で使わない項目まで持っていますが、出したいのはそのうち数個だけ、という切り分けができます。

解説

元のオブジェクトに項目を足して返すのは避けます。skill.text = ... と書くと元の配列の中身まで変わってしまい、あとで元データを見たときに何が本物か分からなくなります。

よくある間違い

  • 戻り値を受け取り忘れる — map は元の配列を変えないので、変数に入れないと何も起きません。書きっぱなしにしても元の配列はそのままです
  • 波かっこ付きのアロー関数で return を書き忘れる — 短い形と長い形が混ざったときに起きます。undefined が並んだら真っ先に疑ってください

要件

  1. 関数名は toWorkLabels とし、引数は作品オブジェクトの配列 works を 1 つだけ受け取る
  2. 戻り値は works と同じ件数の配列で、要素は title と label の 2 つのキーを持つオブジェクトにする
  3. label は year と views をつないだ文字列にし、2026年 / 120回表示 の形にそろえる
  4. 元の works は書き換えず、空配列を渡されたときは空配列を返す

入出力例

toWorkLabels([{"id":1,"published":true,"tags":["HTML","CSS"],"title":"プロフィールサイト","views":120,"year":2026},{"id":2,"published":true,"tags":["HTML"],"title":"自己紹介カード","views":48,"year":2026},{"id":3,"published":true,"tags":["HTML","CSS"],"title":"スキル一覧の表","views":32,"year":2025},{"id":4,"published":false,"tags":["JavaScript"],"title":"作品ギャラリー","views":8,"year":2025},{"id":5,"published":true,"tags":["JavaScript"],"title":"学習ログ","views":200,"year":2024}]) → [{"label":"2026年 / 120回表示","title":"プロフィールサイト"},{"label":"2026年 / 48回表示","title":"自己紹介カード"},{"label":"2025年 / 32回表示","title":"スキル一覧の表"},{"label":"2025年 / 8回表示","title":"作品ギャラリー"},{"label":"2024年 / 200回表示","title":"学習ログ"}] toWorkLabels([{"id":3,"published":true,"tags":["HTML","CSS"],"title":"スキル一覧の表","views":32,"year":2025},{"id":5,"published":true,"tags":["JavaScript"],"title":"学習ログ","views":200,"year":2024}]) → [{"label":"2025年 / 32回表示","title":"スキル一覧の表"},{"label":"2024年 / 200回表示","title":"学習ログ"}] toWorkLabels([{"id":9,"published":false,"tags":[],"title":"下書きの記事","views":0,"year":2026}]) → [{"label":"2026年 / 0回表示","title":"下書きの記事"}] toWorkLabels([]) → []

ヒント

件数が変わらないので map を使います。1 件を受け取って 1 件のオブジェクトを返す形を先に考えます。

アロー関数でオブジェクトをそのまま返すときは work => ({ ... }) のように丸かっこで包みます。

label は文字列の連結です。年と回表示という日本語を挟む位置を間違えないよう、期待される文字列を先に書き出してから組み立てます。

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/03/27·更新 2026/08/26

関連レッスン

  • filter と find で絞り込む

    条件に合う要素を束で取り出す filter と、最初の 1 件だけを取り出す find を使い分けます。見つからなかったときの戻り値の違いを押さえます。

  • reduce でひとつにまとめる

    配列を 1 つの値にたたみ込む reduce を学びます。初期値の役割と、オブジェクトにまとめる書き方を身につけます。

  • sort と比較関数

    sort が元の配列を並べ替えて壊してしまう点と、比較関数を省くと数値が文字列として比べられる点を押さえます。複製してから並べ替える書き方を身につけます。

  • 分類してまとめる groupBy

    配列の要素をキーごとのまとまりに分ける書き方を学びます。reduce の初期値を空オブジェクトにして、年ごとに作品を束ねます。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • 配列サイズ固定の同型データの集まり
  • branchGit で開発するときに毎日打つ 5 つの基本コマンド
  • pushローカルの変更をリモートへ送る操作
  • 関数処理に名前を付けて再利用できる単位
  • 戻り値呼び出し元への返答を表す点線矢印
  • 処理計算や代入を表す長方形
  • オブジェクトキーと値のペアで構造を作るデータ
  • アロー関数=> で書く軽量な関数。this を継承する
main.js
学習モード
エディタを読み込んでいます

メモ

map で形を変える

⌘S で保存