今回は「さらに深いネスト(配列の中のオブジェクト内の配列など)+複合条件更新」の例を作り、ステップ実行で変数・オブジェクト状態を逐次追跡します。
実務での複雑データ(学校→クラス→生徒→科目→課題点数など)に近いイメージです。
練習問題:学校のクラス・生徒・科目ごとの課題点数集計
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ステップ実行(逐次追跡)
| i | j | k | l | 学生 | 科目 | scores[l] | totalScore (前→後) | count (前→後) | avg | 条件 avg>=70 | 条件 avg>=90 | passed | honors |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | Alice | math | 95 | 0→95 | 0→1 | – | – | – | false | false |
| 0 | 0 | 0 | 1 | Alice | math | 85 | 95→180 | 1→2 | – | – | – | false | false |
| 0 | 0 | 1 | 0 | Alice | english | 88 | 180→268 | 2→3 | – | – | – | false | false |
| 0 | 0 | 1 | 1 | Alice | english | 92 | 268→360 | 3→4 | 90 | true | true | true | true |
| 0 | 1 | 0 | 0 | Bob | math | 62 | 0→62 | 0→1 | – | – | – | false | false |
| 0 | 1 | 0 | 1 | Bob | math | 70 | 62→132 | 1→2 | – | – | – | false | false |
| 0 | 1 | 1 | 0 | Bob | english | 58 | 132→190 | 2→3 | – | – | – | false | false |
| 0 | 1 | 1 | 1 | Bob | english | 65 | 190→255 | 3→4 | 63.75 | false | false | false | false |
解説ポイント
- 四重ループ構造
- 外側: クラス → 中: 生徒 → 内: 科目 → 最内: 課題点数
- ネストが深くても、逐次表で1ステップずつ追うことで理解可能
- 複合条件+複数プロパティ更新
- 平均点 >= 70 → passed = true
- 平均点 >= 90 → honors = true
- 逐次追跡表の利点
- totalScore、count、avg、条件評価、最終更新の順序が一目でわかる
- 応用例
- 複数課題・科目ごとの成績集計
- 売上データ(店舗→日→商品→個別売上)の集計
- ネストオブジェクトの条件付き更新全般

