2010-11-27 8 views
0

Ich schreibe einen LocalStorage-Wrapper, um das Einfügen und Abrufen von Daten einfacher zu machen, wenn Sie robustere Abfragen benötigen.Prüfen auf Arten von Objekten in meinem Skript?

Mein Skript ist hier: https://github.com/OscarGodson/storageLocker

Ein Benutzer von meinem Skript mir gefragt, wie er ein Date retten kann, und ich sagte ihm, das richtige Verfahren (new Date().getTime() zum JSON speichern und wieder zu beleben sie mit so etwas wie new Date(json.time) aber er versuchte, hisStorage.save({'the_date':new Date()}) zu tun, aber zu seiner Überraschung, als er ging, um die Daten zu bekommen, wäre es falsch.

Also, meine Frage ist, wie kann ich Einsätze wie diese und andere Objekte fangen (vielleicht Ereignisse?), konvertieren sie für die Benutzer in der JSON gespeichert und auch richtig abgerufen werden? Ich habe den ganzen Tag daran gearbeitet, und ich kann nicht herausfinden, wie zu überprüfen bestimmte Arten von Objekten und konvertieren entsprechend über einen Schalter Fall. Die

speichern und ein Teil meiner Skript abrufen sieht wie folgt aus:

Speichern von Daten:

storageLocker.prototype.save = function(value){ 
    var json = JSON.parse(localStorage.getItem(this.catalog)); 
    if(json == null){json = {};} 
    for(var key in value){ 
     if(value.hasOwnProperty(key)){ 
      json[key] = value[key]; 
     } 
    } 
    localStorage.setItem(this.catalog,JSON.stringify(json)); 
    return this; 
} 

Abrufen von Daten:

storageLocker.prototype.get = function(value){ 
    json = JSON.parse(localStorage.getItem(this.catalog)); 
    if(json == null){json = {};} 
    if(value){ 
     if(typeof json[value] !== 'undefined'){ 
      return json[value]; 
     } 
     else{ 
      //Makes it so you can check with myStorage.get('thisWontExist').length 
      //and it will return 0 and typeof will return object. 
      return new Object(''); 
     } 
    } 
    else{ 
     return json; 
    } 
}; 
+0

http://stackoverflow.com/questions/332422/how-do-i-get-the-name-of-an-objects-type-in-javascript – Stephen

Antwort

2

Verwenden Sie den instanceof Betreiber zu überprüfen ob die Eigenschaft eine Instanz von Date ist :

if (value[key] instanceof Date) { 
    //serialize in some way 
    ... 
}else{ 
    json[key] = value[key]; 
} 

Das Problem ist; Wie wirst du wissen, welche Werte im Getter wiederbelebt werden müssen? Sie müssen sich auf ein Zeichenfolgenformat verlassen und akzeptieren, dass, wenn der Benutzer eine Zeichenfolge in diesem Format speichert, diese als Datum wiederbelebt wird.

+0

Ja, das stimmt auch. Ich denke über irgendeinen kundenspezifischen Datumsspeicher wie (in localStorage) 'sLDate (123467890)' oder etwas nach. Wenn Sie andere Vorschläge haben, lassen Sie es mich wissen. Vielen Dank, ich werde es ausprobieren. Die vorherige Person, die versucht hat, mir zu helfen, sagte, es wäre unmöglich, da Sie keine Objekte in JSON speichern können ... also dachte ich, ich würde nochmal fragen :) –

+0

Nun, Sie können keine Objekte in JSON speichern, aber Sie können speichern seine serialisierten Werte. Über das Format, gehen Sie für eine der bereits verwendeten, wie '/Date(12345 ...)/', die von ASP.NET AJAX usw. verwendet wird. –

+0

Klingt gut, ich war nur versucht, einzigartig zu sein, so dass es würde Es wird nie übergeschrieben, aber deine sollten funktionieren. Aber wenn Sie Objekte in JSON nicht speichern können, wie funktioniert das instanceof goon, um mit meinem Skript zu arbeiten? (Benutzer geben JSON zu meinem Skript, um dann in localStorage zu speichern? In Firebug und Sachen kann ich das Datum Objekt zu sehen –

Verwandte Themen