[英]Compute the union time ranges from two arrays of time ranges (with moment-range)
[英]Counting coverage of moment-range with multiple other ranges
我有一組矩范圍對象:
a = range(2018-10-01 -> 2018-10-05)
b = range(2018-10-10 -> 2018-10-15)
c = range(2018-10-15 -> 2018-10-20)
d = range(2018-10-21 -> 2018-10-25)
因此,我們有一些相鄰的范圍,但沒有一個重疊 。 我也有一個主要范圍:
primary = range(2018-10-01 -> 2018-10-31)
最終目標是創建一些函數,以使用其他范圍檢查主要范圍的覆蓋范圍:
coverage(primary, [a,b,c,d])
// returns 21
// (5 days + 6 days + 5 days + 5 days)
我知道范圍是基於時間(ms)而不是基於天的,但是理想情況下,我會在以后的函數中將其轉換為時間。
請注意,它不會重復計算2018-10-15
。 為此,我考慮的主要解決方案是遍歷每個范圍,如果它們是相鄰或相鄰的,請使用帶有{adjacent:true}
的add方法將范圍合並為最大可能的塊。 這仍然有可能給我留下了一些差距,並找到主要的時間范圍內,總數將需要用蠻力完成(通過每天重復primary
看它是否內任何二級范圍存在。
另一個棘手的部分是,輔助范圍中的一個是否在主要范圍之外開始/結束(可能是2018-09-25 -> 2018-10-02
)。
我是否缺少一些有記載的方法來幫助我實現這一目標? 也許聰明地使用了contains或inside ?
謝謝
編輯: 此討論似乎是話題,我將在嘗試使用他們的subtract
示例后查看是否在這里工作。
此算法適用於您發布的示例:
function subtractRanges (source, others) {
if (!Array.isArray(source)) {
source = [source]
}
return flatten(source.map(s => {
return flatten(others).reduce((remaining, o) => {
return flatten(remaining.map(r => r.subtract(o)))
}, [s])
return remaining
}))
}
這是使用您在問題中發布日期的示例:
https://runkit.com/rocketraman/5b1aaf0bc454290012b9fc5a
結果是:
2018-10-05T00:00:00-04:00/2018-10-10T00:00:00-04:00
2018-10-20T00:00:00-04:00/2018-10-21T00:00:00-04:00
2018-10-25T00:00:00-04:00/2018-10-31T00:00:00-04:00
這正是我所期望的。
注意:我知道您正在處理日期而不是時間。 如果您輸入的日期是帶有0-time和utc()
矩值,請注意,矩距范圍中還有另一個問題 ,該問題會丟失輸入的時區信息,這可能會影響您的日期結果。 您可以通過以下方法映射結果來解決此問題:
function fixRangeIssue228 (range) {
// workaround https://github.com/rotaready/moment-range/issues/228
return moment.range(range.start.utc(), range.end.utc())
}
即
let result = subtractRanges(...).map(fixRangeIssue228)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.