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]
感谢任何帮助!
答案 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)
}
但它依赖于几个前提,例如重叠的间隔是相邻的。
您的代码中的主要问题是,在添加时,您不会更新currBegin currEnd间隔的范围。
其他问题是检测重叠间隔。
最后一个问题是不记得哪些项目已经被放到了一些out数组中(这可以通过简单地删除项目来解决,这可能不是理想的,但如果需要可以以其他方式完成)。