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.9k
2 个回答

先按照开始时间排一下序,然后便利判断,如果当前的 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]);
var arr = [
    { startTime: '1', endTime: '8' },
    { startTime: '6', endTime: '9' },
    { startTime: '8', endTime: '12' },
    { startTime: '12', endTime: '20' },
    { startTime: '20', endTime: '22' },
];
let newArr = arr.filter((v, i) => arr.some((it, ind) =>  i !== ind && +v.endTime > +it.startTime  && +v.startTime < +it.endTime))
console.log(newArr);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题