Javascript查找对象数组中所有出现的名称,并创建新的唯一数组

时间:2018-12-07 12:56:23

标签: javascript arrays google-apps-script foreach

我正在尝试使用Google Apps脚本从Google日历中获取所有匹配项,并为每个事件名称创建单独的数组。 响应数组的简化版本(示例):

{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 :(得分:2)

由于您声明的目标是将每个类似命名的事件的信息收集到单个汇总对象中,因此您的输出数据结构不应是对象数组,而应是关联对象。如果您希望等效的对象保持不同,则使用Array是合适的,但是您声明并非如此。

然后的解决方案是将返回的事件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