では今回は「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ステップ実行(逐次追跡)
| i | j | k | l | m | 名前 | 科目 | scores[m] | totalScore (前→後) | count (前→後) | avg | 条件 avg>=70 | 条件 avg>=90 | passed | honors |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | Alice | math | 95 | 0→95 | 0→1 | – | – | – | false | false |
| 0 | 0 | 0 | 0 | 1 | Alice | math | 85 | 95→180 | 1→2 | – | – | – | false | false |
| 0 | 0 | 0 | 1 | 0 | Alice | english | 88 | 180→268 | 2→3 | – | – | – | false | false |
| 0 | 0 | 0 | 1 | 1 | Alice | english | 92 | 268→360 | 3→4 | 360/4=90 | true | true | true | true |
| 0 | 0 | 1 | 0 | 0 | Bob | math | 62 | 0→62 | 0→1 | – | – | – | false | false |
| 0 | 0 | 1 | 0 | 1 | Bob | math | 70 | 62→132 | 1→2 | – | – | – | false | false |
| 0 | 0 | 1 | 1 | 0 | Bob | english | 58 | 132→190 | 2→3 | – | – | – | false | false |
| 0 | 0 | 1 | 1 | 1 | Bob | english | 65 | 190→255 | 3→4 | 255/4=63.75 | false | false | false | false |
解説ポイント
- 四重ループ
- i: クラス
- j: 生徒グループ
- k: 個別生徒
- l: 科目
- m: 科目内の課題点数
- 複合条件で複数プロパティ更新
- 平均点 >= 70 →
passed = true - 平均点 >= 90 →
honors = true
- 平均点 >= 70 →
- 逐次追跡表のメリット
- どの課題点数が totalScore に加算されたか
- avg と条件判定、複数プロパティの更新タイミングを明確に追える
- 応用
- 実務では成績集計、売上データ集計、在庫やフラグ管理などの多階層データ処理に応用可能


