2010-11-27 5 views
0

J'écris un wrapper localStorage pour faciliter l'insertion et la récupération de données quand il en a besoin pour faire des requêtes plus robustes.Vérification des types d'objets dans mon script?

Mon script est ici: https://github.com/OscarGodson/storageLocker

Un utilisateur de mon script m'a demandé comment il pouvait sauver une date et je lui ai dit la procédure appropriée (sauf new Date().getTime() à la JSON et de faire revivre avec quelque chose comme new Date(json.time) mais il essayait de faire hisStorage.save({'the_date':new Date()}), mais à sa grande surprise quand il est allé chercher les données il serait malformé

Donc, ma question est, comment puis-je attraper des insertions comme ceci et d'autres objets (peut-être des événements?), convertir eux pour les utilisateurs d'être stockés dans le JSON et également récupérés correctement? Je l'ai travaillé toute la journée et je ne peux pas comprendre comment vérifier pour certains types d'objets et de convertir en conséquence via un certain cas de commutateur.

Enregistrer et récupérer une partie de mon script ressemble à ceci:

Sauvegarde des données:

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; 
} 

Obtenir des données:

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

Répondre

2

Utilisez l'opérateur instanceof pour vérifier si la propriété est une instance de Date :

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

Le problème est; dans le getter, comment allez-vous savoir quelles valeurs doivent être relancées? Vous devrez compter sur un format de chaîne et accepter que si l'utilisateur enregistre une chaîne dans ce format, il sera réanimé comme une date.

+0

Oui, c'est également vrai. Je pense à un magasin de date personnalisé comme (dans localStorage) 'sLDate (123467890)' ou quelque chose. Si vous avez d'autres suggestions faites le moi savoir. Merci beaucoup, je vais essayer. La personne précédente qui a essayé de m'aider a dit que ce serait impossible puisque vous ne pouvez pas stocker des objets dans JSON ... donc j'ai pensé que je demanderais à nouveau :) –

+0

Eh bien, vous ne pouvez pas stocker des objets dans JSON, mais vous pouvez stocker ses valeurs sérialisées. A propos du format, optez pour l'un de ceux déjà utilisés, comme '/Date(12345...)/' qui est utilisé par ASP.NET AJAX etc. –

+0

Ça sonne bien J'essayais juste d'être unique pour que ce ne soit pas ne jamais être écrit mais le vôtre devrait fonctionner. Mais si vous ne pouvez pas stocker des objets dans JSON, comment ces instancesof vont-elles fonctionner avec mon script? (Les utilisateurs donnent json à mon script pour ensuite stocker dans localStorage?) Dans firebug et autres choses, je peux voir l'objet date aussi –

Questions connexes