输入整数始终为正
输入:[[1, 4], [3, 7], [6, 8], [10,15]]
输出:[[1, 8], [10,15]]
输入:[[3, 4], [1,3], [5, 9], [5, 12]]
输出:[[1, 4], [5, 12]]
我读了这个stackoverflow,但如果有更好的方法就会徘徊。
答案 0 :(得分:1)
您可以对数据进行升序排序,然后检查前一个是否适合最后一个范围。如果没有将实际数组附加到结果集。
function groupRanges(array) {
return array
.sort(function (a, b) { return a[0]- b[0] || a[1]- b[1]; })
.reduce(function (r, a) {
var last = r[r.length - 1] || [];
if (a[0] <= last[1]) {
if (last[1] < a[1]) {
last[1] = a[1];
}
return r;
}
return r.concat([a]);
}, []);
}
console.log(groupRanges([[1, 4], [3, 7], [6, 8], [10,15]]));
console.log(groupRanges([[3, 4], [1,3], [5, 9], [5, 12]]));
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
答案 1 :(得分:1)
对于范围的每个开始和结束,都会创建一个包含值的对和开始和结束的+1/-1
使用+-1
作为比较函数中的辅助键,按值对这些对进行排序:(x,+1) before (the same x,-1)
制作ActiveRanges=0
,浏览对列表/数组,将+-1
添加到ActiveRanges
。
当ActiveRanges
变为非零时,大范围开始。
当ActiveRanges
变为零时,大范围结束。
答案 2 :(得分:0)
这是我想出的,使用MathJS库来生成范围:
let input = [[1, 4], [3, 7], [6, 8], [10,15]]
let workArray = input.map( arr => math.range(arr.join(":"), true )._data )
workArray = [].concat.apply([], workArray) // Concatenating all values
workArray = [...new Set(workArray)] // Deduplicating, sorting
let output = [],
min = workArray[0],
max = min
for( let i=0, l=workArray.length; i<l ; i++){
if(max+1 != workArray[i+1]){
output.push([min,max])
min = workArray[i+1]
max=min
} else {
max++
}
}
console.log(output) // [ [1,8] , [10,15] ]
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjs/3.13.1/math.min.js"></script>
&#13;
答案 3 :(得分:0)
如果数组长度为4(根据您的示例)并且所有内容都是如您所述的那样是常量,那么这是一个您可以使用的简单函数:
function reGroup(arr) {
const x = [arr[0][0], arr[2][1]];
return [x, arr[3]];
}