在Map实例上使用map / filter行为

时间:2018-03-26 22:34:22

标签: javascript node.js ecmascript-6 es6-map

我有这条快递路线:

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}});

});

其中

 const runningJobs = new Map<CDTChronBase,CDTChronBase>();

(CDTChronBase是一个班级)

上述作品,但我想尽可能简化它,如下所示:

app.use('/stop_jobs', function (req, res, next) {
  const jobId = req.query && req.query.job_id;

  const stopped = runningJobs.keys().filter(j => {
     return j.id === jobId;
  })
  .map(v => {
     return j.stopThisInstance()
  });

  res.json({success: {stopped}});

});

但是对于我的生活,我无法弄清楚如何在Map上获取任何方法的Array实例。有没有办法在Map对象上使用map / filter类型方法?

2 个答案:

答案 0 :(得分:2)

由于键和值是同一个对象,您可以提取其中一个,然后将其转换为数组 如果直接将map转换为数组,它将处于[[key, value],[key, value], ...]结构中。然后选择索引0:

&#13;
&#13;
const stopped = Array.from(runningJobs)
  .map(job => job[0])
  .filter(key => key.id === jobId)
  .map(key => key.topThisInstance());
&#13;
&#13;
&#13;

答案 1 :(得分:1)

我认为你正在寻找

const stopped = Array.from(runningJobs.keys())
  .filter(j => j.id === jobId)
  .map(j => j.stopThisInstance());

除此之外,您还可以使用filter and map functions that work on iterators,例如地图的.keys()