如何过滤一个非常大的json字符串而不循环其中的每个对象?

时间:2009-06-24 19:26:49

标签: jquery json filter

我目前正在开发一个包含所有标准视图(日,周,月)的日历。

要加载我的日历事件,我使用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)\/"
      }
   }
}

2 个答案:

答案 0 :(得分:1)

循环遍历它并构建一个关联数组,或者根据您想要过滤的数据的哈希值。

它不一定是完美的,但有一个建议是按月分组,然后当有人在6月15日到8月12日之间询问日期时,你可以立即添加7月,并在6月和8月之后筛选日期。

然后,这可能不仅仅是首先对它们进行排序,对第一个条目进行二进制搜索,然后对最后一个条目进行二次搜索,这取决于您期望过滤器的次数改变了。

答案 1 :(得分:1)

如果您一次显示一个月(最多),那么我建议您一次只加载/解析/缓存一个月的JSON数据。

如果这不是一个选项,或者你已经这样做了,你可能想要重新索引你的数据或将日期范围限制在可行的范围内。

最佳解决方案在很大程度上取决于您的用户通常使用的方式。