对象内数字的重叠

时间:2011-11-02 21:23:24

标签: javascript arrays

var items = [
    {"id": 1, "begin":10, "end":30},
    {"id": 2, "begin":20, "end":40},
    {"id": 3, "begin":30, "end":50},
    {"id": 4, "begin":40, "end":60},
    {"id": 5, "begin":50, "end":70},
    {"id": 6, "begin":100, "end":170},
    {"id": 7, "begin":120, "end":180}
];

for (var i = 0; i < items.length; i++) {
    var currBegin = items[i].begin;
    var currEnd   = items[i].end;
    var out = [];
    for (var j = 0; j < items.length; j++) {
        var innerBegin = items[j].begin;
        var innerEnd = items[j].end;
        if (innerBegin < currBegin && innerEnd < currEnd && innerEnd >= currBegin)
          out.push(items[j].id);
    }
    console.log(out)           
}

我正在尝试根据初始和结束号检查数字是否相互重叠。 到目前为止,我的代码输出错误:http://jsfiddle.net/bZzSV/

[]
[1]
[1, 2]
[2, 3]
[3, 4]
[]
[6]

基本检查元素是否与另一个元素重叠。 1,2重叠,但1,3没有重叠,但是2,3最终......由于这些链接,1-5重叠。

我想输出:

[1, 2, 3, 4, 5]
[6, 7]

感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

如果您不关心销毁原始项目对象,可以使用这些更改

while (items.length > 0) {
    var curr = items.shift();
    var currBegin = curr.begin;
    var currEnd   = curr.end;
    var out = [curr.id], j = 0;
    while (j < items.length) {
        var innerBegin = items[j].begin;
        var innerEnd = items[j].end;
        if (innerBegin <= currBegin && innerEnd >= currBegin || innerEnd >= currEnd && innerBegin <= currEnd) {
          out.push(items[j].id);
          currBegin = Math.min(currBegin, innerBegin);
          currEnd = Math.max(currEnd, innerEnd);
          items.splice(j, 1);
        } else {
          j++;
        }
    }
    console.log(out)           
}

但它依赖于几个前提,例如重叠的间隔是相邻的。

  1. 您的代码中的主要问题是,在添加时,您不会更新currBegin currEnd间隔的范围。

  2. 其他问题是检测重叠间隔。

  3. 最后一个问题是不记得哪些项目已经被放到了一些out数组中(这可以通过简单地删除项目来解决,这可能不是理想的,但如果需要可以以其他方式完成)。