2016-05-23 73 views
1

標題可能有點混淆,但我會詳細解釋它。我有一個用戶界面的桌子,用戶可以從那裏選擇日期範圍,NodeJS組合對象數組範圍屬性

週一 - {在: 「13:00:00」,指出: 「13點59分59秒」}

星期二 - [{在: 「13:00:00」,指出:「13: 59:59「},{in:」14:00:00「,out:」14:59:59「}]

用戶一天只能選擇多個小時間隔。我已經根據他們的日期進行了分組,間隔時間如

星期二 - [{in:「13:00:00」,out:「14:59:59」},{in:「14 :00:00「,out:」14:59:59「}]

第一次迭代。但我不知道如何使它超過4或5小時的時間間隔.FYI我使用lodash進行排序和分組,以及將小時轉換爲int的時刻。

如果用戶在星期二像[{in:「13:00:00」,out:「13:59:59」},{in:「14:00:00」,out:「14 :59:59 「},{在:」 15:00:00" ,指出: 「15時59分59秒」},{在: 「18:00:00」,指出: 「18點59分59秒」} ,{in:「19:00:00」,out:「19:59:59」}]

我想要合併範圍;

[{in:「13:00:00」,out:「15:59:59」},{in:「18:00:00」,out:「19:59:59」}]

任何幫助或建議將不勝感激。

+0

什麼問題? – CFrei

+0

更新了問題 –

+0

一個範圍可以不同於另一個範圍的最小時間單位是多少?一秒?範圍只是一個'Date'實例的數組?或者他們是字符串/數字/其他? – idbehold

回答

1

假定輸入數據是按時間順序然後實施你的減少的時間的表的一種方法是本;

var timeSlices = [{in:"13:00:00",out:"13:59:59"},{in:"14:00:00",out:"14:59:59"},{in:"15:00:00",out:"15:59:59"},{in:"18:00:00",out:"18:59:59"},{in:"19:00:00",out:"19:59:59"}], 
 
      ts = new Date(), 
 
      te = new Date(), 
 
     reduced = timeSlices.reduce((p,c) => {p.length ? (ts.setHours(...p[p.length-1].out.split(":")), 
 
                 te.setHours(...c.in.split(":")), 
 
                 te-ts <= 1000 ? p[p.length-1].out = c.out 
 
                     : p.push(c)) 
 
                 : p.push(c); 
 
              return p;},[]); 
 
console.log(reduced);

然而,如果與在進出倍的對象陣列然後像根據第一排序它們更概念方法在位於任意的它們在時間將是必不可少的。這不會是一個大問題。

+0

我按日進行分類和分組。讓我試試你的答案。 –

+0

@Fatih Aktepe:那麼我想它不能處理ES6代碼的箭頭函數。那麼它可能也會抱怨擴散算子。你有代碼背後的邏輯嗎?那麼你可以在ES5中複製它?或者作爲另一種想法,您也可以在左側窗格的https://babeljs.io/repl/上覆制粘貼代碼,並在右側獲取ES5版本。 – Redu

+0

感謝您的信息。 –

0

假設範圍由Moment個實例組成,並且您希望合併任意兩個範圍,其中一個範圍的末尾要麼與另一個範圍重疊,要麼小於或等於另一個範圍的起始點後一秒,則此功能應能夠到的範圍,結合

function combineRanges (ranges) { 
    if (ranges.length <= 1) { 
    return ranges 
    } 
    ranges = ranges.sort(byStart) 
    var current = ranges[0] 
    var combined = [current] 
    for (var i = 1; i < ranges.length; i++) { 
    var next = ranges[i] 
    if (current.out.diff(next.in, 'seconds') > 1) { 
     combined.push(next) 
     current = next 
    } else if (current.out.isBefore(next.out)) { 
     current.out = next.out 
    } 
    } 
    return combined 
} 

function byStart (a, b) { 
    return a.in - b.in 
} 
+0

這將結合4個連續的範圍到一個範圍內? –

+0

@FatihAktepe它應該,假設範圍看起來有點像:'{in:moment(),out:moment()}' – idbehold

+0

我將實施您的解決方案並相應地更新問題。謝謝。 –