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

nie*_*lsv 27 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);

}
Run Code Online (Sandbox Code Playgroud)

data参数是JSON对象.

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

有人知道怎么做这个吗?

War*_*0ck 73

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

步骤1:

只有在尚未在localStorage session变量中存储序列化数组时,才应运行下面的第一个代码段.
要确保正确设置localStorage并存储数组,请首先运行以下代码段:

var a = [];
a.push(JSON.parse(localStorage.getItem('session')));
localStorage.setItem('session', JSON.stringify(a));
Run Code Online (Sandbox Code Playgroud)

上面的代码只应运行一次,并且只有在尚未在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));
}
Run Code Online (Sandbox Code Playgroud)

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

希望这可以帮助.


tec*_*bar 8

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

例如:

localStorage.setItem('session', a.join('|'));
Run Code Online (Sandbox Code Playgroud)

要么

localStorage.setItem('session', JSON.stringify(a));
Run Code Online (Sandbox Code Playgroud)


Adr*_*May 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');
Run Code Online (Sandbox Code Playgroud)

顺便说一下,我写了.


Bru*_*olo 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))
}
Run Code Online (Sandbox Code Playgroud)

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