簡體   English   中英

計算瞬間范圍與其他多個范圍的覆蓋范圍

[英]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 )。

我是否缺少一些有記載的方法來幫助我實現這一目標? 也許聰明地使用了containsinside

謝謝

編輯: 此討論似乎是話題,我將在嘗試使用他們的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.

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