簡體   English   中英

從兩個時間范圍數組(含矩范圍)計算聯合時間范圍

[英]Compute the union time ranges from two arrays of time ranges (with moment-range)

我有兩個矩距范圍數組,表示兩個人正忙的時段。

計算包含忙碌的並集時間范圍的數組的最佳方法是什么? 如果兩個人的繁忙時間重疊,那么我需要一個代表他們整個繁忙時間的時間范圍。

這是一個例子:

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函數?

還是最好遞歸地遍歷兩個數組之一,並產生一個包含聯合和非相交期間的堆棧?

我想我會選擇concatreduce

 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 isBetween = function(range, date) { return range.start < date && range.end > date; }; const rangesOverlap = function(rangeOne, rangeTwo) { return isBetween(rangeOne, rangeTwo.start) || isBetween(rangeOne, rangeTwo.end); }; const mergeRanges = function(rangeOne, rangeTwo) { let newRange = {} if (isBetween(rangeOne, rangeTwo.start)) { newRange.start = rangeOne.start; } else { newRange.start = rangeTwo.start; } if (isBetween(rangeOne, rangeTwo.end)) { newRange.end = rangeOne.end; } else { newRange.end = rangeTwo.end; } return newRange; }; const merge = function(rangeCollectionOne, rangeCollectionTwo) { let concatenatedCollections = rangeCollectionOne.concat(rangeCollectionTwo).sort((a,b) => a.start - b.start); let newCollection = concatenatedCollections.reduce((newCollection, range) => { let index = newCollection.findIndex(rangeToCheck => rangesOverlap(rangeToCheck, range)); if (index !== -1) { newCollection[index] = mergeRanges(newCollection[index], range); } else { newCollection.push(range); } return newCollection; }, []); return newCollection; } console.log(merge(firstBusyPeriods, secondBusyPeriods)); 

首先,我嘗試使用標准循環方法,我認為甚至不需要遞歸即可完成任務。 恕我直言, reduceconcat方式更優雅。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM