Javascript находит все вхождения имени в массиве объектов и создает новые уникальные массивы - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь получить все события из календаря Google в Google Apps Script и создать отдельные массивы для каждого имени события.Упрощенная версия (пример) массива ответов:

{summary=Name1, start={dateTime=2018-12-03T15:00:00+01:00}, end={dateTime=2018-12-03T23:00:00+01:00}},
{summary=Name2, start={dateTime=2018-12-04T11:00:00+01:00}, end={dateTime=2018-12-04T23:00:00+01:00}},
{summary=Name1, start={dateTime=2018-12-05T07:00:00+01:00}, end={dateTime=2018-12-05T15:00:00+01:00}}

Я не могу понять, как это отфильтровать / разделить (как бы вы это ни называли), чтобы я получил новуюмассив в следующем формате:

РЕДАКТИРОВАТЬ

{Name1=[[2018-12-03, 15, 23, 8.0], [2018-12-04, 11, 23, 12.0], [2018-12-05, 7, 15, 8.0], [2018-12-06, 15, 23, 8.0]], Name2=[[2018-12-11, 7, 16, 9.0], [2018-12-12, 7, 16, 9.0]]}

Идея состоит в том, чтобы затем выполнить итерацию по этому новому массиву и выполнить foreach, чтобы получить список всех датдля отдельных имен.Насколько я понял,

function hoursTally() {
  var calendarId = [CALENDAR_ID];
  var startDay = 24;
  var endDay = 23;
  var month = parseFloat(new Date().getMonth()).toFixed(0);
  var year = new Date().getYear();
  var startDate = new Date( year, month-1, startDay );
  var endDate = new Date( year, month, endDay );
  var optionalArgs = {
    timeMin: startDate.toISOString(),
    timeMax: endDate.toISOString(),
    showDeleted: false,
    singleEvents: true,
    orderBy: 'startTime'
  };
  var response = Calendar.Events.list(calendarId, optionalArgs);
  var events = response.items;
   events.forEach(function(e){
     Logger.log(e);
      var name = e.summary;
      var eventDateStart = new Date(e.start.dateTime);
      var eventDateEnd = new Date(e.end.dateTime);
      var startTime = parseFloat(eventDateStart.getHours()).toFixed(0);
      var endTime = parseFloat(eventDateEnd.getHours()).toFixed(0);
      var theDate = Utilities.formatDate(eventDateStart, 'GMT+1', 'yyyy-MM-dd');
      var total = endTime-startTime;
  });
}

Каждая попытка зацикливания событий и получения вышеупомянутого формата не удалась: (

1 Ответ

0 голосов
/ 07 декабря 2018

Поскольку ваша заявленная цель состоит в том, чтобы собрать информацию из каждого события с аналогичным именем в единый суммарный объект, ваша структура выходных данных не должна быть массивом объектов - она ​​должна быть просто ассоциативным объектом.Массив был бы уместен, если бы вы хотели, чтобы эквивалентные объекты оставались различимыми, но вы утверждаете, что это не так.

Решение состоит в том, чтобы reduce возвращать события в объект, где ключ данныхэто имя, а значение является массивом информации об экземпляре.Информация об экземпляре сама по себе является массивом (в вашем примере, [2018-12-03, 15, 23, 8])

Простой пример, который вы можете адаптировать к своему варианту использования:

const summary = items.reduce(function (obj, item) {
  var name = item.summary;
  // If we haven't seen this name before, initialize an empty array
  if (obj[name] === undefined) { obj[name] = []; }
  ...
  // Create an array with the info we want to store
  var info = [
    eventStartDate,
    ...
  ];
  // Store this info array with all the others for the same name
  obj[name].push(info);
  return obj;
}, {});

Затем вы используете это summaryпутем итерации объекта:

for (var name in summary) {
  summary[name].forEach(function (info) {
    ...
  });
  ...
}

Array#reduce

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...