JavaScript: Как вернуть сопоставленный массив из функции Array.reduce ()? - PullRequest
0 голосов
/ 24 марта 2020

Почему Фрагмент кода 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 Ответ

1 голос
/ 24 марта 2020

Почему Code Snippet 1 работает, а Code Snippet 2 не работает?

Поскольку обратный вызов выполняется несколько раз, а возвращаемый вами new Map становится ar значение аккумулятора в следующем вызове.

Как бы я правильно сократил фрагмент кода 1?

Чтобы сделать это одно выражение, вы должны использовать

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

Но на самом деле правильным решением было бы вовсе не использовать reduce и push, а просто map и filter. Чтобы удалить дубликаты идентификаторов, следите за ними в 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]
));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...