Javascript 如何使用步长按时间对数组项进行分组

Javascript 如何使用步长按时间对数组项进行分组,javascript,dayjs,Javascript,Dayjs,我有这样一个数组: 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',

我有这样一个数组:

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',
  }
  ...
];
我想通过一些步骤对数组进行分组,例如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',
      }
    ],
  },        
    ...
];
我试过这样做:

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
    }
  )
}       
step=10;
让diffMinutes=dayjs(arr[arr.length-1].end).diff(arr[0].start,'m')/step;
设newArr=[];
让结果=[];
for(设t=0;t
我用
dayjs
添加了一个条件,用于检查事件开始时间是否进入某个时间段。 我想这比我做的容易。 结果将按时间和杆10分组。 所以在else语句中,我应该使用最后一个数组结果的最后一项。 但它只对第一次迭代有效,我不知道下一次如何做


请帮帮我。

您可以根据此值获取时间和组的前四个字符

let array=[{title:'Some title',start:'09:30:59',end:'09:33:59'},{title:'Some title',start:'09:35:59',end:'09:40:59'},{title:'Some title',start:'09:30:59',end:'09:45:59'},
组=s=>s.slice(0,4),
结果=对象.values(数组.reduce((r,o)=>{
常数键=组(o.start);
r[key]=r[key]| |{start:key+'0:00',数组:[]};
r[key].array.push(o);
返回r;
}, {}));
控制台日志(结果)
.as控制台包装{最大高度:100%!重要;顶部:0;}
已解决问题

step=5;
让diffMinutes=Math.round(
dayjs(arr[arr.length-1].end).diff(arr[0].start,“m”)/step
);
让结果=[];
设newArr=[];

对于(var i=0;i),这似乎是一个与合并区间类似的问题()。您可以查看,那里有一个解决方案选项卡。我知道,但是如何按时间间隔将这些项分组到数组中您需要dayjs吗?如果需要,您可以检查两次的持续时间是否比您想要的间隔短。如果没有,或者如果没有差异,您可以从所有的总秒数中检查增量是否在需要范围。是的,我使用dayjs在时间段内检查输入项
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);
  }
}