6

我正在处理一些对象,这些对象包含要从浏览器显示和操作的大量数据,并且我想将其保存在本地存储中。为了保存对象,我使用了 JSON.stringify() 所以一切都变成了文本,而且效果很好

{
"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"
}
}

现在我试图通过将它转换为字符串然后保存它来保存一个函数

JSON.stringify(myFunction.toString());

但输出是这样的

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

将函数保存在本地存储中是正确的方法还是有更好的方法来做到这一点?如果这是正确的方法,有没有办法简单地删除任何制表/缩进字符或者我应该操纵字符串,例如使用一些正则表达式函数?

4

2 回答 2

6

与许多函数式语言一样,JS 中的函数是闭包:它们在定义时将环境范围的内容包装在其中,包括像 db 或文件句柄这样的临时数据。

这不是一个好主意,因为这可能会由于 JSON 反序列化行为而导致问题,因此您必须检查函数中包含的内容以及自定义的内容。

另请参阅此SO 线程以获取更多信息。

于 2012-06-16T13:04:29.530 回答
1

您可以将函数放在一个对象中,并使用我创建的函数 storage.set 和 storage.get 而不是 localStorage.set 和 localStorage.get (localStorage 不允许添加函数,不像 JSON)

storage.set 将在使用 localStorage.setItem() 之前对包含函数的对象进行字符串化。
storage.get 将在使用 localStorage.getItem() 后解析一个包含函数的对象。

我修改了函数 JSON.stringify 和 JSON.parse 以便能够处理函数,因此您可以在代码的其他部分中使用它而无需更改函数名称。我在原始函数中添加了 2,因此我可以在更新后的函数中使用它们。

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;
    }
}
于 2017-09-03T04:09:11.680 回答