JavaScript:如何从array.reduce()函数返回映射数组



为什么代码段1有效,而编码段2无效?

代码段1:

var firstEvents = events.reduce(function(ar, e) {
var id = e.getId();
if (e.isRecurringEvent() && e.isAllDayEvent() && !ar.some(function(f) {return f.eventId == id})) {
ar.push({eventTitle: e.getTitle(), eventId: id, startDate: e.getAllDayStartDate(), endDate: e.getAllDayEndDate()});
}
return ar;
}, []);
firstEvents = new Map(firstEvents.map(entry => [entry.eventTitle, entry.startDate]));

代码段2:

var firstEvents = events.reduce(function(ar, e) {
var id = e.getId();
if (e.isRecurringEvent() && e.isAllDayEvent() && !ar.some(function(f) {return f.eventId == id})) {
ar.push({eventTitle: e.getTitle(), eventId: id, startDate: e.getAllDayStartDate(), endDate: e.getAllDayEndDate()});
}
return (new Map(ar.map(entry => [entry.eventTitle, entry.startDate])));
}, []);

如何正确缩短代码段1

为什么代码段1可以工作,而代码段2不能?

因为回调被执行多次,并且您返回的new Map在下一次调用中成为ar累加器值。

如何正确缩短代码段1?

要使其成为单个表达式,您可以使用

const firstEvents = new Map(events.reduce(…).map(…));

但真正正确的解决方案是根本不使用reducepush,而只使用mapfilter。要删除重复的id,请在Set中跟踪它们,或者更好的做法是通过它们键入另一个映射:

const firstEventsById = new Map(events.filter(e =>
e.isRecurringEvent() && e.isAllDayEvent()
).map(e => {
var id = e.getId();
return [id, {
eventTitle: e.getTitle(),
// eventId: id,
startDate: e.getAllDayStartDate(),
// endDate: e.getAllDayEndDate()
}];
}).reverse());
const startDatesByTitle = new Map(Array.from(firstEventsById.values(), entry =>
[entry.eventTitle, entry.startDate]
));

最新更新