JavaScript | continue文

JavaScript JavaScript
スポンサーリンク

では 本番想定の完全自動化サンプル を作ります。
ポイントは以下です:

  • 複数条件でユーザーをスキップ
  • 部署単位でスキップ
  • スキップ理由をログに記録
  • 条件を満たすユーザーの集計(人数・平均スコアなど)
  • 非同期処理は並列で高速化
  • 部署ごとのレポートを JSON 形式で自動生成

完全版コード例

// 擬似API: 部署ごとのユーザー取得
async function fetchDepartmentUsers(deptName) {
  const data = {
    "営業部": [
      {name:"Alice", active:true, score:85},
      {name:"Bob", active:false, score:90},
      {name:"Charlie", active:true, score:60},
    ],
    "開発部": [
      {name:"David", active:true, score:95},
      {name:"Eve", active:true, score:65},
      {name:"", active:true, score:80}
    ],
    "人事部": [
      {name:"", active:false, score:50},
      {name:"Frank", active:false, score:80}
    ]
  };
  return data[deptName] || [];
}

// 条件判定関数(スキップ理由も返す)
function checkUser(user, minScore = 70) {
  if (!user.name) return {valid:false, reason:"名前なし"};
  if (!user.active) return {valid:false, reason:"非アクティブ"};
  if (user.score < minScore) return {valid:false, reason:`スコア不足 (${user.score} < ${minScore})`};
  return {valid:true, reason:null};
}

// 非同期処理関数
function processUser(user) {
  return new Promise(resolve => {
    setTimeout(() => {
      console.log(`処理完了: ${user.name}, score=${user.score}`);
      resolve();
    }, 200);
  });
}

// 部署レポート作成
function createDepartmentReport(deptName, validUsers, skippedUsers) {
  const avgScore = validUsers.length
    ? (validUsers.reduce((sum,u)=>sum+u.score,0)/validUsers.length).toFixed(2)
    : 0;

  return {
    department: deptName,
    validUsers: validUsers.map(u => ({name:u.name, score:u.score})),
    skippedUsers: skippedUsers,
    totalValid: validUsers.length,
    averageScore: Number(avgScore)
  };
}

// 完全自動化メイン処理
async function main() {
  const departments = ["営業部", "開発部", "人事部"];
  const minScore = 70;
  const reports = [];

  for (const dept of departments) {
    console.log(`--- ${dept} 処理開始 ---`);
    const users = await fetchDepartmentUsers(dept);

    const validUsers = [];
    const skippedUsers = [];

    for (const user of users) {
      const check = checkUser(user, minScore);
      if (!check.valid) {
        skippedUsers.push({name:user.name || "不明", reason:check.reason});
        continue;
      }
      validUsers.push(user);
    }

    if (validUsers.length === 0) {
      console.log(`${dept} に有効ユーザーなし → スキップ`);
      reports.push(createDepartmentReport(dept, [], skippedUsers));
      continue;
    }

    // 並列で非同期処理
    await Promise.all(validUsers.map(user => processUser(user)));

    // 部署レポート作成
    const report = createDepartmentReport(dept, validUsers, skippedUsers);
    reports.push(report);

    console.log(`--- ${dept} 処理完了 ---`);
  }

  console.log("全部署処理完了\n");

  // JSON形式でまとめて出力
  console.log("部署レポート(JSON形式):");
  console.log(JSON.stringify(reports, null, 2));
}

main();
JavaScript

想定出力例

--- 営業部 処理開始 ---
処理完了: Alice, score=85
--- 営業部 処理完了 ---
--- 開発部 処理開始 ---
処理完了: David, score=95
--- 開発部 処理完了 ---
--- 人事部 処理開始 ---
人事部 に有効ユーザーなし → スキップ
全部署処理完了

部署レポート(JSON形式):
[
  {
    "department": "営業部",
    "validUsers": [{"name":"Alice","score":85}],
    "skippedUsers": [
      {"name":"Bob","reason":"非アクティブ"},
      {"name":"Charlie","reason":"スコア不足 (60 < 70)"}
    ],
    "totalValid": 1,
    "averageScore": 85
  },
  {
    "department": "開発部",
    "validUsers": [{"name":"David","score":95}],
    "skippedUsers": [
      {"name":"Eve","reason":"スコア不足 (65 < 70)"},
      {"name":"不明","reason":"名前なし"}
    ],
    "totalValid": 1,
    "averageScore": 95
  },
  {
    "department": "人事部",
    "validUsers": [],
    "skippedUsers": [
      {"name":"不明","reason":"名前なし"},
      {"name":"Frank","reason":"非アクティブ"}
    ],
    "totalValid": 0,
    "averageScore": 0
  }
]

本番向けポイント

  1. 条件判定関数化
    • checkUser でルール変更が簡単
    • スキップ理由も自動取得
  2. 部署単位集計+JSON出力
    • validUsers・skippedUsers・人数・平均スコアをまとめて出力
    • 監査・レポートにそのまま利用可能
  3. 非同期並列処理
    • Promise.all で効率的に処理
    • 条件を満たすユーザーのみ対象
  4. continue の使いどころ
    • ユーザー単位のスキップ
    • 部署単位のスキップ
  5. 拡張性
    • 条件追加や閾値変更が容易
    • 部署ごとに異なる処理・集計も追加可能
タイトルとURLをコピーしました