JavaScript | continue文

JavaScript JavaScript
スポンサーリンク

では 完全汎用モジュール化サンプル を作ります。
特徴は以下です:

  • 任意の部署・ユーザーデータに対応
  • 条件を関数で柔軟に定義可能
  • スキップ理由・集計・非同期処理すべて自動化
  • JSON レポート出力
  • 部署単位・ユーザー単位でのスキップ管理

完全汎用モジュール化サンプル

// ==========================
// 汎用データ処理モジュール
// ==========================

// 非同期データ取得関数(API などを置き換え可能)
async function fetchDepartmentData(deptName) {
  // 実務ではここを API 呼び出しや DB 取得に置き換え
  const sampleData = {
    "営業部": [
      {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 sampleData[deptName] || [];
}

// 条件判定関数(ユーザー単位で柔軟に変更可能)
function defaultUserValidator(user, options = {}) {
  const {minScore = 70} = options;
  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 defaultUserProcessor(user) {
  return new Promise(resolve => {
    setTimeout(() => {
      console.log(`処理完了: ${user.name}, score=${user.score}`);
      resolve();
    }, 200);
  });
}

// 部署レポート作成関数
function createDeptReport(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 processDepartments(options = {}) {
  const {
    departments = [],
    fetchData = fetchDepartmentData,
    validator = defaultUserValidator,
    processor = defaultUserProcessor,
    validatorOptions = {}
  } = options;

  const reports = [];

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

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

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

    if (validUsers.length === 0) {
      console.log(`${dept} に条件を満たすユーザーなし → スキップ`);
      reports.push(createDeptReport(dept, [], skippedUsers));
      continue;
    }

    // 並列非同期処理
    await Promise.all(validUsers.map(u => processor(u)));

    // 部署レポート作成
    reports.push(createDeptReport(dept, validUsers, skippedUsers));
    console.log(`--- ${dept} 処理完了 ---`);
  }

  console.log("全部署処理完了\n");
  console.log("部署レポート(JSON形式):");
  console.log(JSON.stringify(reports, null, 2));

  return reports;
}

// ==========================
// 使用例
// ==========================
(async () => {
  await processDepartments({
    departments: ["営業部", "開発部", "人事部"],
    validatorOptions: {minScore: 70} // 閾値も簡単に変更可能
  });
})();
JavaScript

特徴・ポイント

  1. 汎用性
    • fetchData, validator, processor を差し替えればどんな部署・条件・処理にも対応
  2. 条件変更が簡単
    • validatorOptions で閾値やルールを変更可能
    • 条件判定関数を差し替えれば複雑条件にも対応
  3. スキップ理由を自動収集
    • どのユーザーが何でスキップされたかを JSON レポートに含める
  4. 部署単位スキップ・集計
    • 部署に有効ユーザーがいなければスキップ
    • 有効ユーザー数・平均スコアも自動計算
  5. 非同期並列処理
    • 条件を満たすユーザーだけ並列で処理
    • 大量データでも効率的
  6. 実務活用
    • バッチ処理、レポート作成、API 呼び出し、DB保存など幅広く応用可能
    • JSON レポートをそのまま監査用やフロント用に渡せる

💡 このテンプレートをさらに拡張すれば、部署ごとのカスタム集計・条件・非同期処理ロジックをプラグイン化 することも可能です。

タイトルとURLをコピーしました