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