Группировка дат по ближайшим

#javascript #momentjs

Вопрос:

moment.js и loadash.js

 const startTime =  [ '2021-09-30T02:38:56', '2021-09-30T02:39:56', '2021-09-30T02:40:56', '2021-09-30T02:10:56', '2021-09-30T02:11:56' ] 
 

Первые 3 даты совпадают с разницей в 1 минуту, вторые две даты совпадают с разницей в 1 минуту.

Я хотел сгруппировать даты с разницей всего в 5 минут, как показано ниже.

 [ 
 [ 2021-09-30T02:38:56', '2021-09-30T02:39:56', '2021-09-30T02:40:56' ], 
 [ '2021-09-30T02:10:56', '2021-09-30T02:11:56' ]    
]
 

Я смог добиться результата с помощью нескольких итераций массива, но есть ли какой-нибудь красивый способ?

Комментарии:

1. Вам понадобится база. «разница в 5 минут» относительно чего? не может быть друг к другу. если у вас будет 100 свиданий, каждое из которых на 4 минуты позже предыдущего, то все они будут «с разницей в 5 минут» … вам нужно сначала решить, что здесь является «якорем».

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

Ответ №1:

Вот предложение с одной итерацией массива, если вам это подходит:

 const startTime = ['2021-09-30T02:38:56', '2021-09-30T02:39:56', '2021-09-30T02:40:56', '2021-09-30T02:10:56', '2021-09-30T02:11:56'];
axisSTime = moment(startTime[1]);
const groupedSTimes = [];
let groupedSTime = [startTime[1]];
const MAX_DIFF_MIN = 5;
startTime.slice(1).forEach((sTime, i, slicedArray) => {
  const diffMin = Math.abs(moment(sTime).diff(axisSTime) / 60000);
  if (diffMin > MAX_DIFF_MIN) {
    groupedSTimes.push(groupedSTime);
    groupedSTime = [];
    axisSTime = moment(sTime);
  }
  groupedSTime.push(sTime);
  if(i == slicedArray.length - 1) {
    groupedSTimes.push(groupedSTime);
  }
});
console.log(groupedSTimes); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>