Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将forEach函数转换为reduce函数_Javascript_Arrays - Fatal编程技术网

Javascript 将forEach函数转换为reduce函数

Javascript 将forEach函数转换为reduce函数,javascript,arrays,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] = [s

我被要求重构以下代码:

  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放在函数中,但这还不够好;)

我知道reduce可以将元素添加到一起,并在过程中产生其他有趣的事情,但我特别被要求在reduce中去掉我的变量并使用它们


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

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

因此,您为reduce提供的唯一输入是应用reduce的sessionData。然后,在每次迭代中,它将为您提供
会话
,您可以修改
acum
。 此外,确保在每次迭代结束时返回此
accum
,因为它必须传递到下一次迭代


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

因此,您为reduce提供的唯一输入是应用reduce的sessionData。然后,在每次迭代中,它将为您提供
会话
,您可以修改
acum
。 此外,确保在每次迭代结束时返回此
accum
,因为它必须传递到下一次迭代

给你

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)
给你

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)
您可以在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');
如果(!obj[key])obj[key]=[];
obj[键]。按下(下一步);
返回obj;
},{})
);
您可以在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');
如果(!obj[key])obj[key]=[];
obj[键]。按下(下一步);
返回obj;
},{})
);

如果reduce返回一个新数组,那么原始数组将不会被触碰,因此您跳过了一些副作用。在reduce@jou\u中最好使用[]而不是object{}。当然,请注意,函数内部的
temp
与外部的
temp
不同。就个人而言,为了清楚起见,我会更改名称。@alvarotouzón
reduce
不返回数组。无论如何,你为什么认为在这种情况下使用数组更好?@lvaro Touzón,temp是一个对象而不是数组,根据问题中的内容,如果reduce返回一个新数组,那么原始数组将不会被触及,因此你跳过了一些副作用。当然,在reduce@jo_中使用[]比使用object{}更好,请注意,函数内部的
temp
与外部的
temp
不同。就个人而言,为了清楚起见,我会更改名称。@alvarotouzón
reduce
不返回数组。无论如何,你为什么认为在这种情况下使用数组更好?@lvaro Touzón,根据问题的内容,temp是一个对象而不是数组
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)