2012-06-16 8 views
6

Estoy trabajando con algunos objetos que contienen una cantidad de datos para mostrar y manipular desde el navegador, y quiero guardarlos en el almacenamiento local. Con el fin de guardar los objetos que utilicé JSON.stringify() así que todo convertido en texto, y funciona bienguarde una función en localstorage

{ 
"bindingRef": [], 
"primo": { 
    "name": "primo", 
    "modifiable": true, 
    "binded": false, 
    "isInteger": false, 
    "label": "Numero di Primi" 
}, 
"secondo": { 
    "name": "secondo", 
    "modifiable": true, 
    "binded": false, 
    "isInteger": false, 
    "label": "Numero di Secondi" 
} 
} 

Ahora estoy tratando de salvar también una función mediante su conversión en una cadena y luego se saveing ​​

JSON.stringify(myFunction.toString()); 

pero la salida es este

"savedFunction": "function() {\n\t\t\t\tvar tot = menu.primo.get() * 6 + menu.secondo.get() * 8 + menu.dolce.get() * 4;\n\t\t\t\tif (menu.sconto.get()) {\n\t\t\t\t\treturn tot * 0.90;\n\t\t\t\t} else {\n\t\t\t\t\treturn tot;\n\t\t\t\t}\n\t\t\t}" 

¿es la forma correcta para guardar una función de almacenamiento local o hay una mejor manera de hacer esto? Si esta es la forma correcta, ¿hay alguna forma de eliminar simplemente cualquier carácter de tabulación/sangría o debo manipular la cadena, por ejemplo, usando alguna función de expresión regular?

+0

desea guardar Stringified objeto o función de la firma? ¿Qué salida esperas? – Sarfraz

+0

¿Por qué quieres guardar una función? En mi opinión, no hay una forma "correcta" de hacerlo porque realmente no tiene sentido hacerlo en absoluto. Suponiendo que desea guardar la versión '.toString()' de la función, ¿por qué quiere eliminar pestañas (que podría hacer con '.replace()')? – nnnnnn

Respuesta

5

La función en JS como en muchos lenguajes funcionales son cierres: envuelven dentro de ellos el contenido del alcance del entorno en el momento de la definición, incluidos datos efímeros como db o manejadores de archivos.

No es una buena idea porque puede provocar problemas debido al comportamiento de deserialización de JSON, por lo que debe comprobar qué se envuelve en la función y qué se define automáticamente.

Consulte también este SO thread para obtener más información.

+0

enlace útil y respuesta útil, intentaré evitar guardar una función. gracias – Naigel

1

Puede poner la función en un objeto y usar las funciones storage.set y storage.get que creé en lugar de localStorage.set y localStorage.get (localStorage no permite agregar funciones, a diferencia de JSON).

storage.set stringificará un objeto que incluye funciones antes de usar localStorage.setItem().
storage.get analizará un objeto que incluye funciones después de usar localStorage.getItem().

Modifiqué las funciones JSON.stringify y JSON.parse para poder manejar funciones, para que pueda usarlo en otras partes de su código sin cambiar los nombres de las funciones. Agregué un 2 a las funciones originales, así que puedo usarlas dentro de las funciones actualizadas.

JSON.stringify2 = JSON.stringify; 
JSON.parse2 = JSON.parse; 

JSON.stringify = function(value) { 
    return JSON.stringify2(value, function(key, val) { 
     return (typeof val === 'function') ? val.toString().replace(/\t|\n/g, '') : val; 
    }); 
} 

JSON.parse = function(value) { 
    return JSON.parse2(value, function(key, val) { 
     if (typeof val === 'string') { 
      var regex = /^function\s*\([^()]*\)\s*{.*}$/; 

      if (regex.exec(val) !== null) 
       return eval('key = ' + val); 
      else 
       return val; 
     } else 
      return val; 
    }); 
} 

var storage = {}; 

storage.set = function(key, value) { 
    if (typeof value === 'object') 
     value = JSON.stringify(value); 

    localStorage.setItem(key, value); 
} 

storage.get = function(key) { 
    var value = localStorage.getItem(key); 

    try { 
     return JSON.parse(value); 
    } catch (e) { 
     return value; 
    } 
} 
+0

Anular nativos es una mala práctica. Considera crear nuevas funciones en su lugar. – neeh