Search code examples
javascriptdayjs

How to group item of array by time with step


I have an array like this:

let arr = [
  {
    title: 'Some title',
    start: '09:30:59',
    end: '09:33:59',
  },
  {
    title: 'Some title',
    start: '09:33:59',
    end: '09:35:59',
  },
  {
    title: 'Some title',
    start: '09:35:59',
    end: '09:40:59',
  },
  {
    title: 'Some title',
    start: '09:30:59',
    end: '09:45:59',
  }
  ...
];

And I want to get array grouped by some step for example 10:

let result = [
  {
    start: '09:30:59',
    end: '09:40:59',
    arr: [
      {
        title: 'Some title',
        start: '09:30:59',
        end: '09:33:59',
      },
      {
        title: 'Some title',
        start: '09:33:59',
        end: '09:35:59',
      },
    ],
  }, 
  {
    start: '09:40:59',
    end: '09:50:59',
    arr: [
      {
        title: 'Some title',
        start: '09:35:59',
        end: '09:40:59',
      },
      {
        title: 'Some title',
        start: '09:30:59',
        end: '09:45:59',
      }
    ],
  },        
    ...
];

I tried do it:

let step = 10;
let diffMinutes = dayjs(arr[arr.length - 1].end).diff(arr[0].start, 'm') / step;
let newArr  = [];
let result = [];
for (let t = 0; t < diffMinutes; t++) {
  newArr = [];
  for (let i = 0; i < arr.length; i++) {
    if (dayjs(arr[i].start).isBetween(arr[0].start, dayjs(arr[0].start).add(step, 'm').format('YYYY-MM-DD HH:mm'))) {
      newArr.push(state.events[i]);
    }
  }
  result.push(
    {
      ...
      arr: newArr
    }
  )
}       

I added condition with dayjs that check if event start time enters a certain period of time. I think it can be made easier than I did. Result shout be array grouped by time with stem 10. Sopouse that in else statment I should use last item of last array result. But it work only for first iteration, how to do that in next I dot know.

Help me please.


Solution

  • Resolved problem example

    let step = 5;
    let diffMinutes = Math.round(
      dayjs(arr[arr.length - 1].end).diff(arr[0].start, "m") / step
    );
    let result = [];
    let newArr = [];
    
    for (var i = 0; i <= diffMinutes; i++) {
      newArr = [];
      if (i === 0) {
        for (let j = 0; j < arr.length; j++) {
          if (
            moment(arr[j].start).isSame(arr[0].start) ||
            moment(arr[j].start).isSame(
              dayjs(arr[0].start).add(step, "m").format("YYYY-MM-DD HH:mm:ss")
            ) ||
            moment(arr[j].start).isBetween(
              arr[0].start,
              dayjs(arr[0].start).add(step, "m").format("YYYY-MM-DD HH:mm:ss")
            )
          ) {
            newArr.push(arr[j]);
          }
        }
      } else {
        let lastResult = result[result.length - 1];
        let lastEllArr = lastResult[lastResult.length - 1];
    
        console.log("i" + i, lastEllArr.start);
        for (let j = 0; j < arr.length; j++) {
          if (
            moment(arr[j].start).isSame(
              dayjs(lastEllArr.end).add(step, "m").format("YYYY-MM-DD HH:mm:ss")
            ) ||
            moment(arr[j].start).isBetween(
              lastEllArr.end,
              dayjs(lastEllArr.end).add(step, "m").format("YYYY-MM-DD HH:mm:ss")
            )
          ) {
            newArr.push(arr[j]);
          }
        }
      }
      if (newArr.length !== 0) {
        result.push(newArr);
      }
    }
    

    If anyone suggests improving the code I would appreciate it