JavaScript范围缩减数组

3
什么是在javascript中减少数组范围的最佳方法?
例如,我有一个包含许多范围的数组
1-3,4-5,10-12,2-4

我需要的结果是:
1-5, 10-12

什么是解决这个问题的最佳方法?

5
展示你最好的方式。 - Amit Joki
2个回答

1

1) 解析输入数据,构建以下结构:

var rlist = [    {min: 1, max: 3},    {min: 4, max: 5},    {min: 10, max: 12}    {min: 2, max: 4}];

2) 将列表中的每个间隔合并到一个新列表中:

var olist = [], i, j, r, p, s;
for (i = 0; i < rlist.length; ++i) {
    r = rlist[i];
    for (j = 0; j < olist.length; ) {
        p = olist[j];
        if (r.max+1 < p.min) {
            // insert here
            break;
        } else if (p.max+1 >= r.min) {
            // intersection
            olist.splice(j, 1);
            r.min = p.min;
            r.max = Math.max(r.max, p.max);
        } else {
            ++j;
        }
    }
    olist.splice(j, 0, r);
}

3) 将结果转换为字符串

s = "";
for (j = 0; j < olist.length; ++j) {
    if (j > 0) {
        s += ",";
    }
    s += olist[j].min + "-" + olist[j].max;
}

Fiddle

小提琴


1
我会先创建另一个没有重复项的数组,存储被范围覆盖的数字:
1-3   covers 1, 2, 3    --> [1, 2, 3]
4-5   covers 4, 5       --> [1, 2, 3, 4, 5]
10-12 covers 10, 11, 12 --> [1, 2, 3, 4, 5, 10, 11, 12]
2-4   covers 2, 3, 4    --> [1, 2, 3, 4, 5, 10, 11, 12]

然后,对数组进行排序:
[1, 2, 3, 4, 5, 10, 11, 12] // nothing changed in this example

最后,根据连续的值重新构建范围:
1-5
10-12

3
如果范围始终如此小,我也会这样做。否则可能有一种更有效的方法 - 只是还没有找到它! - khriskooper
这些范围的最大值为250,因此这个解决方案应该可行。谢谢。 - Shingala94

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接