2017-06-13 87 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开始的范围检查。 –