JavaScript | レベル別練習問題:配列

JavaScript
スポンサーリンク

では今回は「4重ネスト+条件付き複数プロパティ更新+課題別計算」の例を作り、ステップ実行で変数・オブジェクトの状態を逐次追跡します。
学校のクラス → 生徒 → 科目 → 課題点数の階層を想定した実務に近い例です。


練習問題:クラスごとの生徒・科目・課題点数の集計とフラグ更新

let school = [
  [ // クラス1
    [ // 生徒1
      { 
        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 
      }
    ]
  ]
];

// 条件付きで複数プロパティを更新(4重ループ)
for (let i = 0; i < school.length; i++) {           // クラス
  for (let j = 0; j < school[i].length; j++) {      // 生徒
    for (let k = 0; k < school[i][j].length; k++) { // 個別生徒
      let student = school[i][j][k];
      let totalScore = 0;
      let count = 0;
      for (let l = 0; l < student.subjects.length; l++) { // 科目
        let subject = student.subjects[l];
        for (let m = 0; m < subject.scores.length; m++) { // 課題点数
          totalScore += subject.scores[m];
          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

出力

[
  [
    [
      {
        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

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

ijklm名前科目scores[m]totalScore (前→後)count (前→後)avg条件 avg>=70条件 avg>=90passedhonors
00000Alicemath950→950→1falsefalse
00001Alicemath8595→1801→2falsefalse
00010Aliceenglish88180→2682→3falsefalse
00011Aliceenglish92268→3603→4360/4=90truetruetruetrue
00100Bobmath620→620→1falsefalse
00101Bobmath7062→1321→2falsefalse
00110Bobenglish58132→1902→3falsefalse
00111Bobenglish65190→2553→4255/4=63.75falsefalsefalsefalse

解説ポイント

  1. 四重ループ
    • i: クラス
    • j: 生徒グループ
    • k: 個別生徒
    • l: 科目
    • m: 科目内の課題点数
  2. 複合条件で複数プロパティ更新
    • 平均点 >= 70 → passed = true
    • 平均点 >= 90 → honors = true
  3. 逐次追跡表のメリット
    • どの課題点数が totalScore に加算されたか
    • avg と条件判定、複数プロパティの更新タイミングを明確に追える
  4. 応用
    • 実務では成績集計、売上データ集計、在庫やフラグ管理などの多階層データ処理に応用可能
タイトルとURLをコピーしました