2009-06-24 6 views
1

Ich entwickle gerade einen Kalender mit allen Standardansichten (Tag, Woche, Monat).Wie filtert man eine sehr große JSON-Zeichenkette, ohne jedes Objekt darin zu durchlaufen?

Um meine Kalenderereignisse zu laden, verwende ich JSON. Wenn die Ereignisse geladen sind, muss ich sie auf der aktiven Ansicht (Tag, Woche oder Monat) zuordnen.

Für jede Ansicht brauche ich nur einen bestimmten Satz von Ereignissen, die Ereignisse zwischen dem Datumsbereich der aktuellen Ansicht (= Zeitrahmen).

Ist es also möglich, die Ereignisse (für das Datum) für jede Ansicht zu filtern, ohne das gesamte JSON-Objekt durchlaufen zu müssen?

Nun ist diese ich tue:

$(eventCache.Events).each(function() { 
    //CHECK IF THIS EVENT SHOULD BE DISPLAYED 
}); 

Aber die Liste der Ereignisse auf ein paar hundert aufstehen so dass diese Methode die Leistung des Kalenders verlangsamt ...

Diese meine Daten ist ein Beispiel:

{ 
    "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)\/" 
     } 
    } 
} 
+1

Sind die Ereignisse sortiert? – Bob

+1

Wenn ich sie sortiert zurücksende, denke ich, dass es der richtige Weg ist, dann kann eine binäre Suche durchgeführt werden. – cgp

+0

Ja, sie sind sortiert – Bundy

Antwort

1

Schleife durch sie einmal und ein assoziatives Array aufzubauen, oder Hash der Daten gruppiert, wie Sie es filtern möchten.

Es wird nicht unbedingt perfekt sein, aber ein Vorschlag besteht darin, sie nach Monaten zu gruppieren, und wenn jemand nach Daten zwischen dem 15. Juni und dem 12. August fragt, können Sie sofort Juli hinzufügen und nur Daten nach Juni und August durchgehen .

Dann wieder, kann dies nicht wirksamer sein als einfach sortieren sie zuerst, eine binäre Suche für den ersten Eintrag zu tun und dann für den letzten Eintrag, je nachdem, wie oft Sie erwarten, dass die Filter gewechselt werden.

+0

Ich stimme zu, das ist, wie ich es tun würde, wahrscheinlich sowohl Sortier-und Hash-Ereignisse von Monat. – Josh

1

Wenn Sie jeweils einen Monat (max) anzeigen, würde ich nur das Laden/Parsen/Zwischenspeichern von JSON-Daten für jeweils einen Monat gleichzeitig empfehlen.

Wenn dies keine Option ist oder wenn Sie es bereits auf diese Weise tun, können Sie Ihre Daten neu indizieren oder den Zeitraum auf etwas Machbares beschränken.

Die beste Lösung hängt stark davon ab, wie Ihre Benutzer normalerweise verwenden.

+0

Momentan verwende ich einen Zeitrahmen von zwei Monaten und es funktioniert, aber wenn ich ein paar Wochen im Voraus überspringen möchte (schnelles Klicken), ist es ein bisschen langsam. Wenn Sie den Google-Kalender betrachten, verwenden sie einen Datumsbereich von zwei Jahren (!) Und wenn Sie Wochen überspringen, ist es blitzschnell ... – Bundy

+0

Nun, wenn Ihre Daten sortiert sind, wird es kaum eine Rolle spielen, wie viele Daten Sie haben . Wenn Sie zwei binäre Suchen durchführen, um den gewünschten Bereich in Ihren Daten zu finden, sollten Sie log (n) time angeben, was ziemlich schnell ist. – cgp