では 完全汎用モジュール化サンプル を作ります。
特徴は以下です:
- 任意の部署・ユーザーデータに対応
- 条件を関数で柔軟に定義可能
- スキップ理由・集計・非同期処理すべて自動化
- 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特徴・ポイント
- 汎用性
fetchData,validator,processorを差し替えればどんな部署・条件・処理にも対応
- 条件変更が簡単
validatorOptionsで閾値やルールを変更可能- 条件判定関数を差し替えれば複雑条件にも対応
- スキップ理由を自動収集
- どのユーザーが何でスキップされたかを JSON レポートに含める
- 部署単位スキップ・集計
- 部署に有効ユーザーがいなければスキップ
- 有効ユーザー数・平均スコアも自動計算
- 非同期並列処理
- 条件を満たすユーザーだけ並列で処理
- 大量データでも効率的
- 実務活用
- バッチ処理、レポート作成、API 呼び出し、DB保存など幅広く応用可能
- JSON レポートをそのまま監査用やフロント用に渡せる
💡 このテンプレートをさらに拡張すれば、部署ごとのカスタム集計・条件・非同期処理ロジックをプラグイン化 することも可能です。
