[英]JavaScript: How to return mapped array from Array.reduce() function?
为什么代码片段 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(…));
但真正正确的解决方案是根本不使用reduce
和push
,而只使用map
和filter
。 要删除重复的 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]
));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.