今回は「ネストループ+複数プロパティ同時更新+複雑条件」の例を作り、ステップ実行で変数・オブジェクトの状態を逐次追跡して解説します。
実務でもよくある「成績管理や売上集計の複合処理」をイメージしています。
練習問題:クラスごとの生徒成績集計(複数プロパティ同時更新)
let school = [
{
className: "1年A組",
students: [
{ name: "Alice", scores: { math: 95, english: 88 }, passed: false, honors: false },
{ name: "Bob", scores: { math: 62, english: 70 }, passed: false, honors: false }
]
},
{
className: "1年B組",
students: [
{ name: "Charlie", scores: { math: 78, english: 85 }, passed: false, honors: false },
{ name: "David", scores: { math: 55, english: 60 }, passed: false, honors: false }
]
}
];
// 平均点と個別条件で passed と honors を更新
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;
let subjects = Object.keys(student.scores); // ["math", "english"]
for (let k = 0; k < subjects.length; k++) {
total += student.scores[subjects[k]];
}
let avg = total / subjects.length;
// 複合条件で複数プロパティを更新
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", scores: { math: 95, english: 88 }, passed: true, honors: true },
{ name: "Bob", scores: { math: 62, english: 70 }, passed: false, honors: false }
]
},
{
className: "1年B組",
students: [
{ name: "Charlie", scores: { math: 78, english: 85 }, passed: true, honors: false },
{ name: "David", scores: { math: 55, english: 60 }, passed: false, honors: false }
]
}
]
JavaScriptステップ実行(逐次追跡)
| i | j | k | 学生 | 科目 | total (前→後) | avg | 条件 avg>=70 | 条件 avg>=90 | passed | honors |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 0 | Alice | math | 0→95 | – | – | – | false | false |
| 0 | 0 | 1 | Alice | english | 95→183 | – | – | – | false | false |
| 0 | 0 | – | Alice | – | 183 | 91.5 | true | true | true | true |
| 0 | 1 | 0 | Bob | math | 0→62 | – | – | – | false | false |
| 0 | 1 | 1 | Bob | english | 62→132 | – | – | – | false | false |
| 0 | 1 | – | Bob | – | 132 | 66 | false | false | false | false |
| 1 | 0 | 0 | Charlie | math | 0→78 | – | – | – | false | false |
| 1 | 0 | 1 | Charlie | english | 78→163 | – | – | – | false | false |
| 1 | 0 | – | Charlie | – | 163 | 81.5 | true | false | true | false |
| 1 | 1 | 0 | David | math | 0→55 | – | – | – | false | false |
| 1 | 1 | 1 | David | english | 55→115 | – | – | – | false | false |
| 1 | 1 | – | David | – | 115 | 57.5 | false | false | false | false |
解説ポイント
- 三重ループ構造
- 外側:
for i→ クラス - 中間:
for j→ 生徒 - 内側:
for k→ 科目ごとの点数
- 外側:
- 複数プロパティ同時更新
passedとhonorsを同時に条件判定で更新avg >= 70→ passed = trueavg >= 90→ honors = true
- 逐次追跡表のメリット
- total と avg がどう変化しているか、条件がどう評価されるか、更新されるプロパティが一目で分かる
- 応用
- 実務では成績集計・売上分析・条件付きフラグ設定などに活用可能
- 条件や科目を増やしても、ステップ実行表で順序や更新箇所を把握できる

