Skip welcome & menu and move to editor
Welcome to JS Bin
Load cached copy from
 
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>JS Bin</title>
</head>
<body>
</body>
</html>
 
// for example i use two arrays with ranges, but in reality they are n (>= 1)
var numbersRanges1 = [
    {start: 100, end: 120},
    {start: 180, end: 200},
    {start: 400, end: 500}
];
var numbersRanges2 = [
    {start: 10, end: 80},
    {start: 150, end: 220},
    {start: 480, end: 500}
];
// result should look like
var expected = [
    {start: 0, end: 10},
    {start: 80, end: 100},
    {start: 120, end: 150},
    {start: 220, end: 400},
    {start: 500, end: 600}
];
var boundary = {
    start: 0,
    end: 600
};
// merge arrays
var mergedRanges = numbersRanges1.concat(numbersRanges2);
// sort by start
function sortByStart(a, b){
    return a.start - b.start;
}
mergedRanges = mergedRanges.sort(sortByStart);
// group overlapping ranges
for(var i = 1; i < mergedRanges.length; i++){
    var range1 = mergedRanges[i-1];
    var range2 = mergedRanges[i];
    if((range1.start <= range2.end) && (range1.end >= range2.start)){
        range2.start = Math.min(range1.start, range2.start);
        range2.end = Math.max(range1.end, range2.end);
        mergedRanges.splice(i-1, 1);
    }
}
// go throw merged ranges and save ranges between in addition array
var freeRanges = [];
if(mergedRanges[0].start > boundary.start){
    freeRanges.push({
        start: boundary.start,
        end: mergedRanges[0].start
    });
}
for(var i = 1, mergedLen = mergedRanges.length; i <  mergedLen; i++){
    freeRanges.push({
        start: mergedRanges[i-1].end,
        end: mergedRanges[i].start
    });
}
if(mergedRanges[mergedLen-1].end < boundary.end){
    freeRanges.push({
        start: mergedRanges[mergedLen-1].end,
        end: boundary.end
    });
}
console.log(freeRanges);
console.log(expected);
Output

You can jump to the latest bin by adding /latest to your URL

Dismiss x
public
Bin info
anonymouspro
0viewers