我在javascript中制作一个脚本,我必须做一些能够读取数字数组并返回一个独特数组的内容,这些数据是" englobes"值。我的阵列看起来像这样:[100,200,500,600,150,250]
值配对为两个。所以它就像A:100-200,B:500-600,C:150-250。
在图像中,它看起来像这样。 (请原谅我在MS Paint上制作的这幅平庸的画作)
所以基本上,我想要的是粉红色的线条。得到的数组将是[100,250,500,600]
我希望这很清楚。
答案 0 :(得分:1)
这是一个非常常见的问题。
var array = [100, 200, 500, 600, 150, 250], temp = [], result = [];
// Group the array in proper ranges
for (var i = 0; i < array.length; i += 2) {
temp.push([array[i], array[i + 1]]);
}
console.log(temp);
# [ [ 100, 200 ], [ 500, 600 ], [ 150, 250 ] ]
// Sort the array based on the first starting number of the range
temp.sort(function(first, second) {
return first[0] - second[0];
});
console.log(temp);
# [ [ 100, 200 ], [ 150, 250 ], [ 500, 600 ] ]
// Push the First range in the result
result.push(temp[0]);
// See the `explanation` below
for (var i = 1; i < temp.length; i += 1) {
var top = result[0], cur = temp[i];
if ((cur[0] < top[0] && cur[1] >= top[0]) || (cur[0] < top[1])) {
result[0] = [Math.min(cur[0], top[0]), Math.max(cur[1], top[1])];
} else {
result.splice(0, 0, cur);
}
}
console.log(result);
# [ [ 500, 600 ], [ 100, 250 ] ]
// Now, flatten the data and sort.
console.log([].concat.apply([], result).sort());
# [ 100, 250, 500, 600 ]
<强>解释强>
对于temp
中的每个元素,检查它是否在第一个元素的范围内
result
的元素。基本上我们将使用result
作为堆栈。
如果当前范围与result
的顶部重叠,则替换
result
的顶部,其范围包含两个元素
答案 1 :(得分:0)
首先,我会重新格式化数组
[100, 200, 500, 600, 150, 250]
更明确的内容,例如
[ {'start':100, 'end':200}, {'start':500, 'end':600}, {'start':150, 'end':250} ]
这显然是一系列间隔。现在,这是一个易于编码但效率不高的解决方案:
对于数组中的每对区间,检查它们是否重叠(即,如果一个区间的“开始”位于另一个区间的“开始”和“结束”之间,或者是“结束”一个间隔在另一个的“开始”和“结束”之间。如果它们重叠,则从数组中删除两个间隔并用新的COMBINED间隔替换它(新的间隔将使'start'等于两个间隔的起点的最小值,并且'end'等于两个间隔的最大值。两个间隔)。
重复此过程,直到您遍历所有数组对,而不会使数组变短。你完成了。