2017-06-13 85 views
-6

我需要從主範圍分割範圍。例如如何分割一定範圍

var start = 0; 
var end = 100; 
var ranges = [ 
{ start: 25, end: 50 }, 
{ start: 60, end: 70 } 
] 

我的預期成果是,

{ start: 0, end: 24}, 
{ start: 51, end: 59}, 
{ start: 71, end: 100} 

如何達致這?

+0

請因此我們你有什麼到目前爲止並解釋任何條件,如當一個範圍爲始端之外會發生什麼。或者如果範圍總是按順序。 –

回答

-1

這是簡單的代碼:

ranges.filter(function(item){return item.start>=start && item.end<=end}) 

+0

只有當所有範圍都在數組'範圍內時,這纔會起作用。與問題不同的是,全範圍與子範圍一起給出,這些子範圍應該從這個完整範圍中豁免。 –

1

我們可以通過去在每個範圍,按壓中間範圍到結果陣列解決這個問題。下面確實允許的範圍進行排序,則溶液,然而,免除範圍不準:

  • 有無重疊
  • (現在固定代碼)開始在整個範圍的開始(例如沒有免除範圍可以在整個範圍內的端部(例如,沒有豁免的範圍可以在100結束)
  • 擁有整個範圍之外的任何開始或結束的值從0開始)
  • 結束。

要說明這些情況,您必須對我的代碼進行擴展。如果你不知道如何,讓我知道,我會幫助!

var start = 0; 
 
    var end = 100; 
 
    var ranges = [ 
 
    { start: 0, end: 5 }, 
 
    { start: 25, end: 50 }, 
 
    { start: 60, end: 70 } 
 
    ] 
 

 
    // First sort the ranges based on the start 
 
    var sortedRanges = ranges.sort(function(a,b) { 
 
    \t return a.start - b.start; 
 
    }); 
 

 
    var res = []; 
 
    // Push each of the intermediate ranges to the result array 
 
    for (var i = 0; i < ranges.length; i++) { 
 
     if (ranges[i].start == start) { 
 
     start = ranges[i].end+1; 
 
     continue; 
 
     } 
 
     res.push({ 
 
     start: start, 
 
     end: ranges[i].start - 1 
 
     }); 
 
     start = ranges[i].end+1; 
 
    } 
 

 
    // Push the final range to the resultArray 
 
    res.push({start: start, end: end}); 
 

 
    console.log(res);

+0

謝謝你,我已經試過這個...但是,如果range.start有0,它不會工作...我正在檢查簡化代碼。 –

+0

下一次當您對StackOverflow提出問題時,請明確注意您已經嘗試過的內容以及您遇到的困難。儘管如此,我已經更改了代碼以包含從0開始的範圍檢查。 –