Javascript 将JSON对象推送到localStorage中的阵列

Javascript 将JSON对象推送到localStorage中的阵列,javascript,json,object,local-storage,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); } 数据参数是一个JSON对象 但每次我单击按钮,它都会覆盖本地存储中的数据 有人知道怎么

我有一个Javascript函数:

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

    localStorage.setItem('session', a);

}
数据参数是一个JSON对象

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

有人知道怎么做吗?

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

例如:

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


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

第一步:

仅当您尚未在localStorage
会话
变量中存储序列化数组时,才应运行下面的第一个代码段。
要确保正确设置localStorage并存储阵列,请首先运行以下代码段:

var a = [];
a.push(JSON.parse(localStorage.getItem('session')));
localStorage.setItem('session', JSON.stringify(a));
上述代码只应运行一次,并且仅当您尚未在localStorage
会话
变量中存储数组时才应运行。如果您已经在执行此操作,请跳到步骤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));
}
剩下的就交给你了。当您解析它时,它将成为一个对象数组


希望这能有所帮助。

将整个阵列放入一个本地存储条目是非常低效的:每次向阵列添加内容或更改一个条目时,都需要对整个阵列重新编码

var arr = [ 'a', 'b', 'c'];
arr.push('d'); // insert as last item
另一种方法是使用存储任何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');

顺便说一句,这是我写的。

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

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

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

尝试使用
window.a=[]然后像这样推<代码>window.a.push(receiveddata)
。或者只在函数开始时将其存储在一个新的“a”中一次。您是否也在实际输入中执行此操作<代码>localStorage.setItem('session',window.a)本地存储的类型是什么?因为您为同一个密钥session设置了相同的值,所以它将被忽略。@user1775531没问题,伙计!很乐意帮忙。祝你好运,编码快乐!:)谢谢你知道我如何把它作为独立的数组从本地存储中取出吗?@user1775531不知道我在跟踪你,伙计?将其作为单独的阵列输出?这是一个数组吗?@War10ck,你好,我刚刚偶然发现了这个,并且喜欢这个主意。你能看一下并说一下这是否是一个合适的方法吗?@War10ck super。。。你能给我看一下检查数组中数据的代码吗?如果存在的话,我需要执行我的操作。谢谢。这是一个很棒的库!谢谢答案中给出的链接已失效。指向github页面的链接
Storage.prototype.setObj = function(key, obj) {
    return this.setItem(key, JSON.stringify(obj))
}
Storage.prototype.getObj = function(key) {
    return JSON.parse(this.getItem(key))
}