如何创建一个能够吸引其他值的数组?

时间:2014-04-04 03:20:03

标签: javascript html arrays web merge

我在javascript中制作一个脚本,我必须做一些能够读取数字数组并返回一个独特数组的内容,这些数据是" englobes"值。我的阵列看起来像这样:[100,200,500,600,150,250]

值配对为两个。所以它就像A:100-200,B:500-600,C:150-250。

在图像中,它看起来像这样。 (请原谅我在MS Paint上制作的这幅平庸的画作)

http://i.imgur.com/z5ZNgs9.png

所以基本上,我想要的是粉红色的线条。得到的数组将是[100,250,500,600]

我希望这很清楚。

2 个答案:

答案 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'等于两个间隔的最大值。两个间隔)。

重复此过程,直到您遍历所有数组对,而不会使数组变短。你完成了。