簡體   English   中英

JavaScript:如何從 Array.reduce() 函數返回映射數組?

[英]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(…));

但真正正確的解決方案是根本不使用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]
));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM