将JSON对象推送到localStorage中的数组

时间:2013-04-18 13:11:14

标签: javascript json object local-storage

我在Javascript中有一个函数:

var a = [];
function SaveDataToLocalStorage(data)
{       
    var receiveddata = JSON.stringify(data);
    a.push(receiveddata);
    alert(a);

    localStorage.setItem('session', a);

}

data参数是JSON对象。

但每次我点击按钮都会覆盖我本地存储中的数据。

有人知道怎么做吗?

5 个答案:

答案 0 :(得分:65)

您需要采取一些步骤将此信息正确存储在localStorage中。然而,在我们开始讨论代码之前,请注意localStorage(当前时间)不能保存除字符串之外的任何数据类型。您需要序列化数组以进行存储,然后将其解析出来以对其进行修改。

步骤1:

如果您尚未在localStorage session变量中存储序列化数组,则只能运行下面的第一个代码段。
要确保正确设置localStorage并存储数组,请首先运行以下代码段:

var a = [];
a.push(JSON.parse(localStorage.getItem('session')));
localStorage.setItem('session', JSON.stringify(a));

上述代码只能运行一次,并且只有在尚未在localStorage session变量中存储数组时才能运行。如果您已经这样做,请跳到第2步。

第2步:

像这样修改你的功能:

function SaveDataToLocalStorage(data)
{
    var a = [];
    // Parse the serialized data back into an aray of objects
    a = JSON.parse(localStorage.getItem('session'));
    // Push the new data (whether it be an object or anything else) onto the array
    a.push(data);
    // Alert the array value
    alert(a);  // Should be something like [Object array]
    // Re-serialize the array back into a string and store it in localStorage
    localStorage.setItem('session', JSON.stringify(a));
}

这应该照顾好你的其余部分。解析它时,它将成为一个对象数组。

希望这有帮助。

答案 1 :(得分:8)

截至目前,您只能在localStorage中存储字符串值。您需要序列化数组对象,然后将其存储在localStorage中。

例如:

localStorage.setItem('session', a.join('|'));

localStorage.setItem('session', JSON.stringify(a));

答案 2 :(得分:6)

将整个数组放入一个localStorage条目是非常低效的:每次向数组添加内容或更改一个条目时,都需要重新编码整个数组。

另一种方法是使用http://rhaboo.org存储任何JS对象,无论如何深度嵌套,为每个终端值使用单独的localStorage条目。数组更加忠实地恢复,包括非数字属性和各种类型的稀疏性,在标准情况下恢复对象原型/构造函数,API非常简单:

var store = Rhaboo.persistent('Some name');
store.write('count', store.count ? store.count+1 : 1);

store.write('somethingfancy', {
  one: ['man', 'went'],
  2: 'mow',
  went: [  2, { mow: ['a', 'meadow' ] }, {}  ]
});  
store.somethingfancy.went[1].mow.write(1, 'lawn');

BTW,我写了。

答案 3 :(得分:5)

我可以建议您扩展存储对象以处理对象和数组。

LocalStorage只能处理字符串,因此您可以使用这些方法来实现

Storage.prototype.setObj = function(key, obj) {
    return this.setItem(key, JSON.stringify(obj))
}
Storage.prototype.getObj = function(key) {
    return JSON.parse(this.getItem(key))
}

使用它,每个值都将在set上转换为json字符串并在get

上解析

答案 4 :(得分:-2)

var arr = [ 'a', 'b', 'c'];
arr.push('d'); // insert as last item