1. 3 件を集計して最新作を選ぶ
  2. 1 件だけならその作品が最新
  3. 空配列は count 0 で latest は null
  4. views が無い作品は 0 として合計する
  5. 同じ年が並んだら先に出てきたほうが最新
コース一覧
JavaScript基礎文法:処理を組み立てる
つくる 作品データを構造化する

JavaScript基礎文法:処理を組み立てる

if・switch による条件分岐、配列とループ、関数とコールバック、オブジェクトを順に組み立てる全 33 レッスン(525 分)の基礎文法コースです。FizzBuzz、作品リスト、関数への整理、作品データの構造化を通して、入力から結果を返す処理を自分で分解して書きます。DOM 操作は次のコースで扱います。

1
条件分岐
01. if 文の基本15分
02. if / else if / else で段階判定15分
03. switch 文で値を一覧から選ぶ15分
04. 条件を組み合わせる20分
05. FizzBuzz で複数条件を組み立てる20分
06. つくる 時間帯で挨拶を変える20分
07. 第1章まとめクイズ10分
2
配列とループ
01. 配列のきほん15分
02. 要素を足す・取り除く15分
03. for ループで合計を求める15分
04. for-of で配列を走査する15分
05. while で条件を満たす間くり返す15分
06. break と continue でループを制御する15分
07. つくる 作品リストを一覧にする20分
08. 第2章まとめクイズ10分
3
関数
01. 関数宣言15分
02. アロー関数15分
03. デフォルト引数15分
04. 早期 return でネストを浅くする15分
05. 変数のスコープ15分
06. コールバック関数15分
07. forEach で配列をまわす15分
08. つくる 処理を関数に整理する20分
09. 第3章まとめクイズ10分
4
オブジェクト
01. オブジェクトのきほん18分
02. オブジェクトで複数の値を返す16分
03. const と参照18分
04. ?. で安全に取り出す16分
05. 分割代入18分
06. スプレッド構文18分
07. find と includes で探す16分
08. つくる 作品データを構造化する25分
09. 第4章まとめクイズ10分

つくる 作品データを構造化する

解説

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

  • 集計関数は、返す形を先に決めてから中身を書きます
  • 欠けたプロパティと空配列に耐える関数を書けます

1 件でも欠けていると、合計が NaN になる

第7章を通して、プロフィールサイトのデータはタイトルだけの配列から、1 件ごとに複数の情報を持つオブジェクトの配列へ育ちました。総仕上げとして、その配列から件数と合計閲覧数と最新作をまとめて返す関数を書きます。決まりは次のとおりです。

  • 件数は配列の長さをそのまま使う
  • 閲覧数の合計は、views が無い作品を 0 として足す
  • 最新作は year が最大の作品のタイトル。同じ年が並んだら、先に出てきたほうを採用する
  • 空配列のときは、件数も合計も 0、最新作は null

いちばん多い失敗は 2 つ目です。下書き中の作品にはまだ閲覧数が無いかもしれないのに、そのまま足してしまうケースです。

JavaScript

console.log(0 + undefined); // NaN

一度 NaN が混ざると、その後どれだけ足しても NaN のままです。画面には「NaN 回」という意味不明な表示が出ます。第3章の ?? を入り口に置けば防げます。

JavaScript

const entry = { label: "CSS" }; // level が無い console.log(entry.level ?? 0); // 0 無いときだけ 0 を使う

|| ではなく ?? を選ぶのは、本当に 0 だった値をそのまま残したいからです。今回はどちらでも同じ結果になりますが、数値には ?? と決めておくと事故りません。

集めるものは、1 回のループで全部集める

3 つの値を求めるからといって、ループを 3 回まわす必要はありません。足し上げながら、同時に最大値も追いかけられます。最大値を追う変数は、初期値を「必ず負ける値」にしておくのが定石です。

JavaScript

let topLevel = -Infinity; console.log(3 > topLevel); // true 1 件目で必ず更新される

0 を初期値にしても多くの場合は動きますが、-Infinity のほうが「まだ何も見ていない」という意図がはっきりします。件数のように、すでに用意されているものは自分で数えません。

JavaScript

console.log(["HTML", "CSS", "JavaScript"].length); // 3

同点のときに、どちらを残すか

同じ年が並んだときにどちらを採用するかは、比較の記号ひとつで決まります。

JavaScript

let top = 2026; console.log(2026 > top); // false 更新されないので先に見たほうが残る console.log(2026 >= top); // true 更新されるので後から来たほうに入れ替わる

先に出てきたほうを残したいなら > です。ここを >= にすると、同じ年が並ぶケースだけテストが落ちます。

空配列のときの答えも、実装の前に決めておきます。ループが 1 度もまわらないので、初期値がそのまま戻り値になります。

初期値の候補呼び出し側での扱い
null値が無いことを意図して表せる
undefinedキーの書き忘れと区別が付かない
""空文字と未登録が区別できない
"なし"表示用の文言が集計関数に混ざる

今回は null を選びます。値が無いことを意図して表すという null 本来の意味に合っていて、呼び出し側も latest ?? "まだ作品がありません" の 1 行で表示を決められるからです。表示の文言を集計関数に持ち込まないのは、覚えておく価値のある習慣です。

よくある間違い

  • 戻り値のキー名を間違える — キー名は関数の外向きの約束です。つづりが違っても undefined が返るだけでエラーにならないので、気付くのが遅れます
  • 欠けたプロパティを守らずに足す — NaN はどんな比較でも false を返すため、if (total > 0) のような判定もすり抜けます。入り口で ?? を使うのがいちばん確実です

要件

  1. 関数名は summarizeWorks、引数は作品オブジェクトの配列 works の 1 つ
  2. 戻り値は count totalViews latest の 3 つのキーを持つオブジェクト
  3. views が無い作品は 0 として合計すること
  4. latest は year が最大の作品の title。同じ年なら先に出てきたほうを採用すること
  5. 空配列のときは { count: 0, totalViews: 0, latest: null } を返すこと

入出力例

summarizeWorks([{"published":true,"title":"プロフィールサイト","views":120,"year":2024},{"published":true,"title":"自己紹介カード","views":80,"year":2026},{"published":false,"title":"スキル一覧の表","views":40,"year":2025}]) → {"count":3,"latest":"自己紹介カード","totalViews":240} summarizeWorks([{"published":true,"title":"プロフィールサイト","views":120,"year":2026}]) → {"count":1,"latest":"プロフィールサイト","totalViews":120} summarizeWorks([]) → {"count":0,"latest":null,"totalViews":0} summarizeWorks([{"title":"自己紹介カード","year":2026},{"title":"スキル一覧の表","views":40,"year":2025}]) → {"count":2,"latest":"自己紹介カード","totalViews":40} summarizeWorks([{"title":"プロフィールサイト","views":10,"year":2026},{"title":"自己紹介カード","views":5,"year":2026}]) → {"count":2,"latest":"プロフィールサイト","totalViews":15}

ヒント

`count` は `works.length` でそのまま取れます。自分で数える必要はありません

合計と最新作は 1 回の `for-of` でまとめて集められます。`totalViews` と `latestYear` の 2 つの変数を用意します

`work.views ?? 0` で欠けている閲覧数を守ります。守らないと `undefined` が混ざって合計が `NaN` になります

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

関連レッスン

  • 第4章まとめクイズ

    オブジェクトの作り方と読み方から、参照・分割代入・スプレッド・検索まで、第7章で扱った内容を 5 問で確かめます。

  • find と includes で探す

    配列から条件に合う要素を探す道具です。値が欲しいのか位置が欲しいのか有無だけでよいのかで使い分けます。

  • スプレッド構文

    ... で配列やオブジェクトの中身を展開する書き方です。元を壊さずにコピーや合成ができます。

  • 分割代入

    オブジェクトや配列から必要な値をまとめて変数に取り出す書き方です。既定値や名前の付け替えもできます。

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

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

  • 関数処理に名前を付けて再利用できる単位
  • プロパティメソッドを属性のようにアクセスできるようにするデコレータ。
  • 配列サイズ固定の同型データの集まり
  • オブジェクトキーと値のペアで構造を作るデータ
  • ループ繰り返し処理。矢印で戻すか専用記号で示す
  • 変数データに名前をつけて参照する仕組み
  • テストバグを見つける工程
  • 戻り値呼び出し元への返答を表す点線矢印
main.js
学習モード
エディタを読み込んでいます

メモ

つくる 作品データを構造化する

⌘S で保存