js 时间交集问题?
已知时间
var arr = [
    { startTime: '1', endTime: '8' },
    { startTime: '6', endTime: '9' },
    { startTime: '8', endTime: '12' },
    { startTime: '12', endTime: '20' },
    { startTime: '20', endTime: '22' },
];因为 arr[0] 和 arr[1],arr[1] 和 arr[2] 有交集所以需要把 arr[0]、arr[1]、arr[2] 拎出来,这种有什么好的方法吗
回复
1个回答

test
2024-07-13
先按照开始时间排一下序,然后便利判断,如果当前的 startTime 小于前一个的 endTime ,就认为有交叉了,然后把前一个和当前元素都加到 Set 里面,最后转成数组。
var arr = [
  { startTime: '1', endTime: '8' },
  { startTime: '6', endTime: '9' },
  { startTime: '8', endTime: '12' },
  { startTime: '12', endTime: '20' },
  { startTime: '20', endTime: '22' },
];
arr.sort((a, b) => a.startTime - b.startTime)
const result = arr.reduce((result, current, index, refArr) => {
  if (index === 0) {
    return result
  }
  const prev = refArr[index - 1];
  if (current.startTime < prev.endTime) {
    result.add(prev).add(current)
  }
  return result
}, new Set)
console.log([...result]);
回复

适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容
