では 本番想定の完全自動化サンプル を作ります。
ポイントは以下です:
- 複数条件でユーザーをスキップ
- 部署単位でスキップ
- スキップ理由をログに記録
- 条件を満たすユーザーの集計(人数・平均スコアなど)
- 非同期処理は並列で高速化
- 部署ごとのレポートを 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
}
]
本番向けポイント
- 条件判定関数化
checkUserでルール変更が簡単- スキップ理由も自動取得
- 部署単位集計+JSON出力
- validUsers・skippedUsers・人数・平均スコアをまとめて出力
- 監査・レポートにそのまま利用可能
- 非同期並列処理
Promise.allで効率的に処理- 条件を満たすユーザーのみ対象
continueの使いどころ- ユーザー単位のスキップ
- 部署単位のスキップ
- 拡張性
- 条件追加や閾値変更が容易
- 部署ごとに異なる処理・集計も追加可能
