我目前正在开发一个包含所有标准视图(日,周,月)的日历。
要加载我的日历事件,我使用JSON。加载事件后,我必须在活动视图(日,周或月)上映射它们。
对于每个视图,我只需要一组特定的事件,即当前视图的日期范围(=时间帧)之间的事件。
那么,是否可以在不循环整个JSON对象的情况下过滤每个视图的事件(日期)?
现在我正在这样做:
$(eventCache.Events).each(function() {
//CHECK IF THIS EVENT SHOULD BE DISPLAYED
});
但是事件列表最多可以达到几百个,所以这种方法会降低日历的性能......
这是我的数据示例:
{
"d":{
"__type":"GetEventsCacheResult",
"Events":[
{
"Subject":"Subject",
"CalendarId":"139c9edd-b01b-47cf-bae9-18f3e3dca655",
"ColorCode":"#093647",
"Id":"0dab7ad9-46c7-e230-294e-0933e78eadae",
"Description":null,
"DTStartDate":" \/Date(1244596500000)\/",
"DTEndDate":"\/Date(1244610000000)\/",
"StartDate":"10/06/2009 1:15:00",
"EndDate":"10/06/2009 5:00:00",
"AppointmentType":0,
"AllDay":false
},
{
"Subject":"Subject",
"CalendarId":"139c9edd-b01b-47cf-bae9-18f3e3dca655",
"ColorCode":"#093647",
"Id":"0fddb3a0-65f1-08c7-daf2-13da605b499b",
"Description":null,
"DTStartDate":" \/Date(1245823200000)\/",
"DTEndDate":"\/Date(1245832200000)\/",
"StartDate":"24/06/2009 6:00:00",
"EndDate":"24/06/2009 8:30:00",
"AppointmentType":0,
"AllDay":false
},
{
"Subject":"Subject",
"CalendarId":"139c9edd-b01b-47cf-bae9-18f3e3dca655",
"ColorCode":"#093647",
"Id":"a95b8a2b-7c8a-677f-dc58-1c9836d72748",
"Description":null,
"DTStartDate":" \/Date(1247633100000)\/",
"DTEndDate":"\/Date(1247646600000)\/",
"StartDate":"15/07/2009 4:45:00",
"EndDate":"15/07/2009 8:30:00",
"AppointmentType":0,
"AllDay":false
}
],
"Dates":{
"StartDate":"\/Date(1238022000000 )\/",
"EndDate":"\/Date(1285106400000)\/"
}
}
}
答案 0 :(得分:1)
循环遍历它并构建一个关联数组,或者根据您想要过滤的数据的哈希值。
它不一定是完美的,但有一个建议是按月分组,然后当有人在6月15日到8月12日之间询问日期时,你可以立即添加7月,并在6月和8月之后筛选日期。
然后,这可能不仅仅是首先对它们进行排序,对第一个条目进行二进制搜索,然后对最后一个条目进行二次搜索,这取决于您期望过滤器的次数改变了。
答案 1 :(得分:1)
如果您一次显示一个月(最多),那么我建议您一次只加载/解析/缓存一个月的JSON数据。
如果这不是一个选项,或者你已经这样做了,你可能想要重新索引你的数据或将日期范围限制在可行的范围内。
最佳解决方案在很大程度上取决于您的用户通常使用的方式。