JavaScript | レベル別練習問題:繰り返し(for / while / do…while)

JavaScript
スポンサーリンク

今回は「さらに深いネスト(配列の中のオブジェクト内の配列など)+複合条件更新」の例を作り、ステップ実行で変数・オブジェクト状態を逐次追跡します。
実務での複雑データ(学校→クラス→生徒→科目→課題点数など)に近いイメージです。


練習問題:学校のクラス・生徒・科目ごとの課題点数集計

let school = [
    {
        className: "1年A組",
        students: [
            { 
                name: "Alice", 
                subjects: [
                    { name: "math", scores: [95, 85] },
                    { name: "english", scores: [88, 92] }
                ],
                passed: false, 
                honors: false 
            },
            { 
                name: "Bob", 
                subjects: [
                    { name: "math", scores: [62, 70] },
                    { name: "english", scores: [58, 65] }
                ],
                passed: false, 
                honors: false 
            }
        ]
    }
];

// 平均点で passed と honors を更新(4重ループ+複合条件)
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 totalScore = 0;
        let count = 0;
        for (let k = 0; k < student.subjects.length; k++) { // 科目
            let subject = student.subjects[k];
            for (let l = 0; l < subject.scores.length; l++) { // 課題点数
                totalScore += subject.scores[l];
                count++;
            }
        }
        let avg = totalScore / count;
        if (avg >= 70) {
            student.passed = true;
            student.honors = avg >= 90 ? true : false;
        } else {
            student.passed = false;
            student.honors = false;
        }
    }
}

console.log(school);
JavaScript

出力

[
  {
    className: "1年A組",
    students: [
      {
        name: "Alice",
        subjects: [
          { name: "math", scores: [95,85] },
          { name: "english", scores: [88,92] }
        ],
        passed: true,
        honors: true
      },
      {
        name: "Bob",
        subjects: [
          { name: "math", scores: [62,70] },
          { name: "english", scores: [58,65] }
        ],
        passed: false,
        honors: false
      }
    ]
  }
]
JavaScript

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

ijkl学生科目scores[l]totalScore (前→後)count (前→後)avg条件 avg>=70条件 avg>=90passedhonors
0000Alicemath950→950→1falsefalse
0001Alicemath8595→1801→2falsefalse
0010Aliceenglish88180→2682→3falsefalse
0011Aliceenglish92268→3603→490truetruetruetrue
0100Bobmath620→620→1falsefalse
0101Bobmath7062→1321→2falsefalse
0110Bobenglish58132→1902→3falsefalse
0111Bobenglish65190→2553→463.75falsefalsefalsefalse

解説ポイント

  1. 四重ループ構造
    • 外側: クラス → 中: 生徒 → 内: 科目 → 最内: 課題点数
    • ネストが深くても、逐次表で1ステップずつ追うことで理解可能
  2. 複合条件+複数プロパティ更新
    • 平均点 >= 70 → passed = true
    • 平均点 >= 90 → honors = true
  3. 逐次追跡表の利点
    • totalScore、count、avg、条件評価、最終更新の順序が一目でわかる
  4. 応用例
    • 複数課題・科目ごとの成績集計
    • 売上データ(店舗→日→商品→個別売上)の集計
    • ネストオブジェクトの条件付き更新全般

タイトルとURLをコピーしました