では 部署ごとにカスタム条件・処理・集計をプラグイン化できる完全実務向けサンプル を作ります。
完全プラグイン化テンプレート
特徴:
- 部署ごとに条件判定、非同期処理、集計方法をカスタマイズ可能
- スキップ理由も自動記録
- 非同期並列処理対応
- JSONレポート出力
- 新しい部署や条件も簡単に追加可能
コード例
// ==========================
// 汎用データ処理モジュール
// ==========================
async function fetchDepartmentData(deptName) {
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] || [];
}
// ==========================
// デフォルトプラグイン
// ==========================
const defaultValidator = (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};
};
const defaultProcessor = user => new Promise(resolve => {
setTimeout(() => {
console.log(`処理完了: ${user.name}, score=${user.score}`);
resolve();
}, 200);
});
const defaultAggregator = (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,
totalValid: validUsers.length,
averageScore: Number(avgScore)
};
};
// ==========================
// 本番向けプラグイン化メイン処理
// ==========================
async function processDepartmentsWithPlugins(config) {
const {departments, fetchData, plugins} = config;
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 = (plugins.validator || defaultValidator)(user, plugins.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((plugins.aggregator || defaultAggregator)(dept, [], skippedUsers));
continue;
}
// 並列非同期処理
await Promise.all(validUsers.map(u => (plugins.processor || defaultProcessor)(u)));
// 部署レポート作成
const report = (plugins.aggregator || defaultAggregator)(dept, validUsers, skippedUsers);
reports.push(report);
console.log(`--- ${dept} 処理完了 ---`);
}
console.log("全部署処理完了\n");
console.log("部署レポート(JSON形式):");
console.log(JSON.stringify(reports, null, 2));
return reports;
}
// ==========================
// 使用例:部署ごとにプラグインを差し替え
// ==========================
(async () => {
const customPlugins = {
validator: (user, options={minScore:80}) => {
// 営業部だけスコア90以上を条件に変更
if (user.name === "Alice") return {valid:false, reason:"営業部特別条件でスキップ"};
return defaultValidator(user, options);
},
processor: async (user) => {
await new Promise(r => setTimeout(r, 100)); // 高速処理例
console.log(`ユーザー ${user.name} をカスタム処理`);
},
aggregator: (deptName, validUsers, skippedUsers) => {
return {
department: deptName,
totalValid: validUsers.length,
skippedUsers,
validUserNames: validUsers.map(u=>u.name)
};
},
validatorOptions: {minScore:70}
};
await processDepartmentsWithPlugins({
departments: ["営業部", "開発部", "人事部"],
fetchData: fetchDepartmentData,
plugins: customPlugins
});
})();
JavaScript特徴・ポイント
- 部署ごとに条件・処理・集計をプラグイン化
- 部署ごとに
validator・processor・aggregatorを差し替え可能
- 部署ごとに
- スキップ理由を自動記録
skippedUsersに理由を残すことで監査対応可能
- 非同期並列処理対応
- 条件を満たすユーザーだけ
Promise.allで高速処理
- 条件を満たすユーザーだけ
- JSONレポート出力
- 集計・スキップ理由・有効ユーザーリストを一括取得
- 柔軟性
- 新しい部署やルール追加、条件変更が容易
- 実務で即活用できる大規模データ対応
💡 このテンプレートをさらに拡張すると、
- 部署ごとの異なる API エンドポイント
- 条件判定や集計ルールの完全モジュール化
- 結果を外部DBやフロントに自動送信
など、 本番運用レベルのバッチ処理フレームワーク として使えます。
