JavaScript | レベル別練習問題:オブジェクト

JavaScript
スポンサーリンク

今回は「配列の中にオブジェクト、そのオブジェクトの中にさらに配列」という、ネストが深い構造を対象に、ステップ実行解説を紹介します。
変数の状態を逐次追跡しながら、条件分岐やループ処理を理解できるようにします。


練習問題:配列 → オブジェクト → 配列のネスト構造

let school = [
    {
        className: "1年A組",
        students: [
            { name: "Alice", scores: [95, 88, 92], passed: false },
            { name: "Bob", scores: [62, 70, 58], passed: false }
        ]
    },
    {
        className: "1年B組",
        students: [
            { name: "Charlie", scores: [78, 85, 80], passed: false },
            { name: "David", scores: [55, 60, 65], passed: false }
        ]
    }
];

// 各生徒の平均点を計算して合格判定
for (let i = 0; i < school.length; i++) {
    let classroom = school[i];
    for (let j = 0; j < classroom.students.length; j++) {
        let student = classroom.students[j];
        let total = 0;
        for (let k = 0; k < student.scores.length; k++) {
            total += student.scores[k];
        }
        let avg = total / student.scores.length;
        if (avg >= 70) {
            student.passed = true;
        }
    }
}

console.log(school);
JavaScript

出力(抜粋)

[
  {
    className: "1年A組",
    students: [
      { name: "Alice", scores: [95, 88, 92], passed: true },
      { name: "Bob", scores: [62, 70, 58], passed: false }
    ]
  },
  {
    className: "1年B組",
    students: [
      { name: "Charlie", scores: [78, 85, 80], passed: true },
      { name: "David", scores: [55, 60, 65], passed: false }
    ]
  }
]
JavaScript

ステップ実行(逐次追跡)

ijk学生scorestotalavg条件評価passed
000Alice[95,88,92]0→95false
001Alice[95,88,92]95→183false
002Alice[95,88,92]183→275false
00Alice[95,88,92]27591.6791.67 >= 70 → truetrue
010Bob[62,70,58]0→62false
011Bob[62,70,58]62→132false
012Bob[62,70,58]132→190false
01Bob[62,70,58]19063.3363.33 >= 70 → falsefalse
100Charlie[78,85,80]0→78false
101Charlie[78,85,80]78→163false
102Charlie[78,85,80]163→243false
10Charlie[78,85,80]2438181 >= 70 → truetrue
110David[55,60,65]0→55false
111David[55,60,65]55→115false
112David[55,60,65]115→180false
11David[55,60,65]1806060 >= 70 → falsefalse

解説ポイント

  1. 三重ループの構造
    • 外側 for (i) → クラス
    • 中間 for (j) → 学生
    • 内側 for (k) → 各学生のスコア
  2. ネストされたオブジェクト&配列の参照
    • school[i].students[j].scores[k] で配列内の値を取得
    • student.passed = true でオブジェクトを直接更新
  3. 条件分岐
    • 平均点 avg >= 70 で合格判定
  4. 逐次表のメリット
    • どの生徒のどのスコアが計算されているか、平均値がどう変化しているかを明確に追える
  5. 参照型の注意
    • student 変数はオブジェクト参照なので、passed 更新は元の school 配列に反映される

応用ポイント

  • このパターンは「成績計算」「売上データ集計」「ネストした設定オブジェクトの更新」など、実務で非常によく出てくる
  • ネストが深くなる場合は、逐次追跡表やデバッグログを作るとバグを防ぎやすい
  • 条件や集計を増やす場合でも、基本のステップ実行の考え方は同じ
タイトルとURLをコピーしました