如何利用map/filter简化基于Map实例的Express任务停止路由代码?
简化Express停止Job路由的Map/Filter实现方案
嘿,这段代码完全可以借助数组的filter和map方法,结合Map的原生特性来简化,不用手动写for循环,逻辑会更简洁易读。
先回顾下你的原代码:
app.use('/stop_jobs', function (req, res, next) { const jobId = req.query && req.query.job_id; const stopped : Array<any> = []; for (let j of runningJobs.keys()) { if(j.id === jobId){ stopped.push(j.stopThisInstance()); } } res.json({success: {stopped}}); });
其中runningJobs是键和值均为CDTChronBase实例的Map。
简化后的代码
app.use('/stop_jobs', function (req, res, next) { const jobId = req.query?.job_id; // 用可选链简化空值判断 const stopped: Array<any> = Array.from(runningJobs.values()) .filter(job => job.id === jobId) .map(job => job.stopThisInstance()); res.json({success: {stopped}}); });
简化思路说明
- 替换
keys()为values():因为你的Map键和值是同一个CDTChronBase实例,直接取values更直观,不用绕弯拿key。 Array.from()转换可迭代对象:Map.values()返回的是可迭代对象,转成数组后就能直接用数组的filter和map方法。- 链式调用完成筛选+收集:先筛选出匹配
jobId的Job实例,再对每个实例调用stopThisInstance(),一步完成原循环里的判断和结果收集操作。 - 可选链简化
jobId获取:req.query?.job_id是ES2020+的语法,比req.query && req.query.job_id更简洁,如果你的Node.js版本较低,保留原写法即可。
改完后逻辑和原代码完全一致,但代码更精炼,可读性也更高~
内容的提问来源于stack exchange,提问作者user7898461
相关产品推荐
相关产品推荐

