我有以下输入,例如:
events = [
{ start: 30, end: 150},
{ start: 540, end: 600},
{ start: 560, end: 620},
{ start: 610, end: 670}
]
开始,结束意味着从上午9点开始的分钟或其他任何事情。
我想要这样的输出,
events = [
[{ start: 30, end: 150}],
[{ start: 540, end: 600}, {start: 560, end: 620}, {start: 610, end: 670}]
]
我有一个函数确定两个对象是否会及时发生碰撞。
var isOverLapping = function(event1, event2){
if (event1.end >= event2.start && event1.start <= event2.end) {
return true;
}
return false;
};
例如,我在开头可以看到四个事件,比方说1,2,3,4。
由于2次与3次碰撞,3次与2次碰撞,4次碰撞3次。
所以他们应该属于一组[2,3,4],即[{ start: 540, end: 600}, {start: 560, end: 620}, {start: 610, end: 670}]
我知道可能会感到困惑。希望这会让我的想法更加清晰。想想与时间碰撞作为联系。如果A连接到B而B连接到C,那么A也连接到C,因此它们应该属于一个集合。
我需要帮助用JavaScript编写这个。有什么想法吗?我发布此帖时,我没有找到一个好方法。
感谢。
答案 0 :(得分:2)
这应该有效:
events = [
{ start: 30, end: 150},
{ start: 540, end: 600},
{ start: 560, end: 620},
{ start: 610, end: 670}
]
var sets=[], max, arr=[];
events.sort(function(a,b){return a.start-b.start}) // sort by start time
if(events.length){
max=events[0].end
arr.push(events[0])
}
for(var i=1;i<events.length;i++){
var event = events[i];
if(event.start <= max){ // overlap (we already know that event.start >= the one before )
arr.push(event) // push event
max=Math.max(max, event.end) // update max
}else{
sets.push(arr.slice(0)); // push what we have till now
arr=[]; // clear array
max=event.end; // update max
arr.push(event) // push event
}
}
sets.push(arr.slice(0)); // push remaining
console.log(sets)
答案 1 :(得分:0)
如果至少有一个在范围内,则必须检查(开始和结束),然后对象属于第二个组。试试这个功能:
var isOverLapping = function(event){
// "calendar" on line below should ref the element on which fc has been called
for(var i = 0 ; i < events.length; i++) {
if ((event.end >= events[i].start && event.end <= events[i].end)
|| (event.start >= events[i].start && event.start <= events[i].end)) {
return true;
}
}
return false;
};