Как отфильтровать очень большую строку JSON без зацикливания каждого объекта в нем? - PullRequest
1 голос
/ 24 июня 2009

В настоящее время я разрабатываю календарь со всеми стандартными представлениями (день, неделя, месяц).

Для загрузки событий календаря я использую 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 ]

1 голос
/ 24 июня 2009

Если вы отображаете один месяц за раз (макс.), Я бы рекомендовал загружать / анализировать / кэшировать только данные JSON за один месяц.

Если это не вариант или вы уже делаете это таким образом, возможно, вы захотите переиндексировать свои данные или ограничить диапазон дат до чего-либо осуществимого.

Лучшее решение во многом зависит от того, как ваши пользователи обычно используют его.

1 голос
/ 24 июня 2009

Выполните его один раз и создайте ассоциативный массив или хэш данных, сгруппированных так, как вы хотите отфильтровать.

Это не обязательно будет идеально, но одно предложение - сгруппировать их по месяцам, а затем, когда кто-то запрашивает даты между 15 июня и 12 августа, вы можете сразу добавить июль и просеять только даты после июня и августа.

Опять же, это может быть не более эффективно, чем просто отсортировать их сначала, выполняя двоичный поиск для вашей первой записи, а затем для последней записи , в зависимости от того, сколько раз вы ожидаете, что фильтр измененное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...