Как удалить (и посчитать) дубликаты в массиве - PullRequest
0 голосов
/ 22 января 2020

Я довольно новичок в Google Apps Script (а не инженер).

Я работаю над инструментом для анализа своего календаря, и у меня есть массив, который называется "события", который содержит подробную информацию о каждом Встреча, которую я проводил за определенный период времени.

Я хочу создать НОВЫЙ массив, который НЕ содержит дубликатов, но вместо этого имеет счетчик для количества дубликатов. Например:

Массив событий:

Index: Name, Duration, Recurring?

1: "Lunch", 60, "Yes"

2: "Catchup with Tom", 30, "Yes"

3: "Quick update", 60, "No"

4: "Lunch", 60, "Yes"

5: "Catchup with Tom", 30, "Yes"

Новый массив:

Index: Name, Duration, COUNT

1: "Lunch", 60, 2

2: "Catchup with Tom, 30, 2

3: "Quick update", 60, 1

Я нашел какой-то удивительный код JavaScript, который использует «Reduce», но пример для одномерного массива. Может ли он быть изменен, чтобы быть многомерным?

Примечание: в моем фактическом коде я сравниваю «Имя» каждого собрания И «Описание», чтобы найти дубликаты (они не показаны в моем упрощенном примере выше) .

var ar = ['a', 'a', 'b', 'c', 'c'];
var result = ar.reduce(function(r, e) {
  r[e] = (r[e] || 0) + 1;
  return r;
}, {});

console.log(result)

Обновление

У меня возникли некоторые ошибки при попытке запустить ответ из 'tehhowch', но я думаю Я их исправил. К сожалению, в журнале ничего не появляется, когда я пытаюсь запустить свой код.

Вот мой новый код:

...
var mycal = stp.getRange("B1").getValue();  // e-mail address for calendar
var cal = CalendarApp.getCalendarById(mycal);

var cal_start = stp.getRange("B2").getValue(); // start date
var cal_end = stp.getRange("B3").getValue();  // end date
var events = cal.getEvents(new Date(cal_start), new Date(cal_end));

var nameIndex = 0;
var descriptionIndex = 1;
var obj =[]; // Added this after answer to fix "undefined error"

var summary = events.reduce(function(obj, row) {
  var key = row[nameIndex] + ", " + row[descriptionIndex];
  obj[key] = (obj[key]++ || 0); // Fixed this line from answer?
  return obj;
}, {});
Logger.log(obj);
...

Ответы [ 2 ]

0 голосов
/ 23 января 2020

Получить список событий Удалить дубликаты, но номер записи каждого

function getUniqueEventList() {
  var mylist=[];
  var cal=CalendarApp.getCalendarById('calendar id');
  var td=new Date();
  var startTime=new Date(td.getFullYear(),td.getMonth(),td.getDate()-2);//2 days ago
  var endTime=new Date(td.getFullYear(),td.getMonth(),td.getDate()+5);//five days from now
  var events=cal.getEvents(startTime, endTime);
  var obj={eA:[]};
  for(var i=0;i<events.length;i++) {
    var key=events[i].getTitle()+events[i].getDescription();
    if(!obj.hasOwnProperty(key)) {
      obj[key]={title:events[i].getTitle(),description:events[i].getDescription(),start:events[i].getStartTime(),id:events[i].getId(),copies:0};
      obj.eA.push(key);
    }else{
      obj[key].copies+=1;//count the copies
    }
  }
  for(var i=0;i<obj.eA.length;i++) {
    mylist.push(obj[obj.eA[i]]);
  }
  Logger.log(JSON.stringify(mylist));
}
0 голосов
/ 22 января 2020

Ключи объектов преобразуются в строки при вставке / адресации хэш-карты, чтобы код уже находил точные дубликаты. Для reduce многомерного массива ваш e будет более точно назван row, а row[0] будет его первым элементом.

Например:

var nameIndex = 0;
var descriptionIndex = 4;

var summary = myArr.reduce(function(obj, row) {
  var key = row[nameIndex] + ", " + row[descriptionIndex];
  obj[key] = ++(obj[key] || 0);
  return obj;
}, {});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...