将forEach函数变成化简函数

时间:2019-02-07 10:32:20

标签: javascript arrays

已要求我重构以下代码:

  const temp = {};
  this.sessionData = [];
  sessionsData.forEach(session => {
    const date = moment(session.startDatetime).format('DDMMYYYY');
    if (temp[date]) {
      temp[date].push(session);
    } else {
      temp[date] = [session];
    }
  });

显然,使用reduce可以更有效?

我试图简单地将reduce放在函数中,但这还不够好;)

  const temp = {};
  this.sessionData = [];
  sessionsData.reduce(session => {
    const date = moment(session.startDatetime).format('DDMMYYYY');
    if (temp[date]) {
      temp[date].push(session);
    } else {
      temp[date] = [session];
    }
  });

我知道reduce可以将元素添加在一起,但是在过程中还会发生其他有趣的事情,特别是我被要求摆脱我的变量,并在我想的reduce中使用它们!

任何帮助将不胜感激!谢谢!

3 个答案:

答案 0 :(得分:3)

如果要使用reduce重构它,则必须为累加器设置初始值{},然后必须修改此累加器,这就是reduce在迭代之后将返回的内容根据您的数据。然后,您必须将此返回的累加器分配给您的temp变量。

因此,您提供给reduce的唯一输入是sessionData,在其上应用reduce。然后,在每次迭代时,它会给您session,然后您修改accum。 另外,请确保在每次迭代结束时都返回此accum,因为必须将其传递给下一个迭代。

Here is the MDN doc on reduce

const temp = sessionData.reduce((accum, session) => {
    const date = moment(session.startDatetime).format('DDMMYYYY');
    if (accum[date]) {
        accum[date].push(session);
    } else {
        accum[date] = [session];
    }
    return accum;
}, {});

答案 1 :(得分:0)

你在这里

let dates = [{startDatetime: '2016-01-02'}, {startDatetime: '2016-02-02'}, {startDatetime: '2016-03-02'}];

const temp = dates.reduce(function(acc, cur) {
  const date = moment(cur.startDatetime).format('DDMMYYYY');
  if(acc[date]) acc[date].push(cur)
  else acc[date] = [cur]
  return acc;
}, {})

console.log(temp)

答案 2 :(得分:0)

您可以在es6中使用

var sessionData = [
{foo:'bar', startDatetime: Date.now()},
{xxx:'yyy', startDatetime: Date.now()}
];

console.log(
  sessionData.reduce((obj,next) => {
      const key = moment(sessionData.startDatetime).format('DDMMYYYY');
      if(!obj[key]) obj[key] = [];
      obj[key].push(next);
      return obj;
 },{})
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>