Javascript 从两个时间范围数组计算联合时间范围(使用矩范围)

Javascript 从两个时间范围数组计算联合时间范围(使用矩范围),javascript,ecmascript-6,momentjs,Javascript,Ecmascript 6,Momentjs,我有两个数组,表示两个人忙碌的时间段 计算一个数组的最佳方法是什么,该数组包含它们正忙的联合时间范围?如果个人的两个繁忙时段重叠,我需要表示他们繁忙的整个时段的时间范围 下面是一个例子: const firstBusyPeriods = [ { start: "2017-04-05T10:00:00Z", end: "2017-04-05T12:00:00Z" }, { start: "2017-04-05T14:00:00Z", end: "2017-04-05T15:00:00Z"

我有两个数组,表示两个人忙碌的时间段

计算一个数组的最佳方法是什么,该数组包含它们正忙的联合时间范围?如果个人的两个繁忙时段重叠,我需要表示他们繁忙的整个时段的时间范围

下面是一个例子:

const firstBusyPeriods = [ 
  { start: "2017-04-05T10:00:00Z", end: "2017-04-05T12:00:00Z" },
  { start: "2017-04-05T14:00:00Z", end: "2017-04-05T15:00:00Z" }
]

const secondBusyPeriods = [
  { start: "2017-04-05T08:00:00Z", end: "2017-04-05T11:00:00Z" },
  { start: "2017-04-05T16:00:00Z", end: "2017-04-05T17:00:00Z" }
]
生成的数组应如下所示:

const result = [
  { start: "2017-04-05T08:00:00Z", end: "2017-04-05T12:00:00Z" },
  { start: "2017-04-05T14:00:00Z", end: "2017-04-05T15:00:00Z" },
  { start: "2017-04-05T16:00:00Z", end: "2017-04-05T17:00:00Z" }
]
结果包含重叠繁忙时段的并集,然后包括两个个体之间不重叠的时段

最好将两个数组连接起来,对结果数组进行排序,然后应用reduce函数吗


还是最好递归遍历两个数组中的一个,并生成一个具有并集和非相交周期的堆栈?

我想我会选择
concat
reduce

const firstBusyPeriods=[{
开始:“2017-04-05T10:00:00Z”,
完:“2017-04-05T12:00:00Z”
},
{
开始:“2017-04-05T14:00:00Z”,
完:“2017-04-05T15:00:00Z”
}
];
const secondBusyPeriods=[{
开始:“2017-04-05T08:00:00Z”,
完:“2017-04-05T11:00:00Z”
},
{
开始:“2017-04-05T16:00:00Z”,
完:“2017-04-05T17:00:00Z”
}
];
const isBetween=函数(范围、日期){
返回range.startdate;
};
常量rangesOverlap=函数(rangeOne,Range2){
返回isBetween(rangeOne,rangeTwo.start)| isBetween(rangeOne,rangeTwo.end);
};
常量合并范围=函数(范围一,范围二){
设newRange={}
if(isBetween(rangeOne,rangeTwo.start)){
newRange.start=rangeOne.start;
}否则{
newRange.start=rangeTwo.start;
}
if(isBetween(rangeOne,rangeTwo.end)){
newRange.end=rangeOne.end;
}否则{
newRange.end=rangeTwo.end;
}
返回新范围;
};
const merge=函数(rangeCollectionOne,rangeCollectionTwo){
让concatenatedCollections=rangeCollectionOne.concat(rangeCollectionTwo).sort((a,b)=>a.start-b.start);
让newCollection=concatenatedCollections.reduce((newCollection,range)=>{
让index=newCollection.findIndex(rangeToCheck=>rangesOverlap(rangeToCheck,range));
如果(索引!=-1){
newCollection[index]=合并范围(newCollection[index],范围);
}否则{
newCollection.push(范围);
}
返回新集合;
}, []);
返回新集合;
}

log(合并(第一个busyperiods,第二个busyperiods))答案很好,这里有一个类似的问题,应该很容易修改:它不应该是isBetween函数中的=而不仅仅是<和>?