【问题标题】:How to make an array of values that englobes other values?如何制作包含其他值的值数组?
【发布时间】:2014-05-16 04:22:37
【问题描述】:

我正在用 javascript 编写一个脚本,我必须做一些事情来读取一个数字数组并返回一个“englobes”值的唯一数组。我的数组看起来像这样:[100, 200, 500, 600, 150, 250]

值成对成对。所以就像A:100-200,B:500-600,C:150-250。

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

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

我希望这已经足够清楚了。

【问题讨论】:

  • 请发布您尝试的代码。
  • 我会,但到目前为止我没有任何有意义的东西,对不起!
  • 你试过什么??贴一些代码..

标签: javascript html arrays web merge


【解决方案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 的顶部,包含两个元素的范围

【讨论】:

  • 我试过你的版本,并把它和我的代码放在一起,它可以工作!太感谢了,这几天一直在这。这很难理解,我会多读一些以完全掌握这个想法。再次感谢!
【解决方案2】:

首先,我将重新格式化数组

[100, 200, 500, 600, 150, 250]

变成更明确的东西,例如

[ {'start':100, 'end':200}, {'start':500, 'end':600}, {'start':150, 'end':250} ]

这显然是一个区间数组。现在,这是一个易于编码但效率不高的解决方案:

对于数组中的每一对区间,检查它们是否重叠(即,一个区间的“开始”是否在另一个区间的“开始”和“结束”之间,或者一个间隔在另一个的“开始”和“结束”之间)。如果它们重叠,则从数组中删除两个区间并将其替换为新的 COMBINED 区间(新区间的“开始”等于两个区间开始的最小值,“结束”等于两个区间)。

重复此过程,直到您在数组的所有对中迭代一次,而数组不会变短。你已经完成了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-15
    • 2019-07-01
    • 2022-07-20
    • 2014-11-18
    • 1970-01-01
    • 2013-06-29
    • 1970-01-01
    相关资源
    最近更新 更多