已要求我重构以下代码:
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中使用它们!
任何帮助将不胜感激!谢谢!
答案 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>