代码之家  ›  专栏  ›  技术社区  ›  David

如何在本地存储中存储阵列?[复制品]

  •  534
  • David  · 技术社区  · 16 年前

    这个问题已经有了答案:

    如果我不需要localstorage,我的代码如下所示:

    var names=new Array(); 
    names[0]=prompt("New member name?");
    

    这是可行的。但是,我需要将这个变量存储在localstorage中,结果证明它相当顽固。我试过了:

    var localStorage[names] = new Array();
    localStorage.names[0] = prompt("New member name?");
    

    我哪里出错了?

    6 回复  |  直到 9 年前
        1
  •  993
  •   Thomas Mairé Dagg Nabbit    10 年前

    localStorage 只支持字符串。使用 JSON.stringify() JSON.parse() .

    var names = [];
    names[0] = prompt("New member name?");
    localStorage.setItem("names", JSON.stringify(names));
    
    //...
    var storedNames = JSON.parse(localStorage.getItem("names"));
    
        2
  •  104
  •   Sebastian    14 年前

    这个 localStorage sessionStorage 只能处理字符串。可以扩展默认存储对象以处理数组和对象。只需包含此脚本并使用新方法:

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

    使用 localStorage.setObj(key, value) 保存数组或对象并 localStorage.getObj(key) 去找回它。同样的方法也适用于 会话存储 对象。

    如果只使用新方法访问存储,那么在保存之前,每个值都将转换为JSON字符串,并在getter返回之前进行解析。

    来源: http://www.acetous.de/p/152

        3
  •  15
  •   Matt user129975    12 年前

    使用 JSON.stringify() JSON.parse() 按不建议!这可以防止包含分隔符(例如成员名称)的成员名称出现可能很少但可能出现的问题 three|||bars )

        4
  •  6
  •   jonsca    13 年前

    刚刚创建了:

    https://gist.github.com/3854049

    //Setter
    Storage.setObj('users.albums.sexPistols',"blah");
    Storage.setObj('users.albums.sexPistols',{ sid : "My Way", nancy : "Bitch" });
    Storage.setObj('users.albums.sexPistols.sid',"Other songs");
    
    //Getters
    Storage.getObj('users');
    Storage.getObj('users.albums');
    Storage.getObj('users.albums.sexPistols');
    Storage.getObj('users.albums.sexPistols.sid');
    Storage.getObj('users.albums.sexPistols.nancy');
    
        5
  •  3
  •   Lassi Kinnunen    14 年前

    JSON方法可以工作,在IE7上,您需要json2.js,它可以完美地工作,尽管有一条评论说它上面有本地存储。这似乎是最简单的解决方案。当然,人们可以编写脚本来做与JSON2基本相同的事情,但这并没有什么意义。

    至少在下面的版本字符串中有localstorage,但是正如前面所说,您需要包括json2.js,因为浏览器本身不包括它: 4.0(兼容;msie 7.0;Windows NT 6.1;wow64;trident/5.0;slcc2;.net clr 2.0.50727;.net clr 3.5.30729;.net clr 3.0.30729;bri/2;np06;.net4.0c;.net4.0e;zune 4.7) (我本可以在回复中对此发表评论,但做不到)。

        6
  •  2
  •   Markus Hedlund    14 年前

    另一种解决方案是编写一个这样存储数组的包装器:

    localStorage.setItem('names_length', names.length);
    localStorage.setItem('names_0', names[0]);
    localStorage.setItem('names_1', names[1]);
    localStorage.setItem('names_' + n, names[n]);
    

    消除转换为JSON的开销,但如果需要删除元素,则会很烦人,因为必须重新索引数组:)