使用JSON.stringify在localStorage中存储数组

时间:2010-07-27 23:40:13

标签: jquery arrays json local-storage

just learned about jquery's .makeArray我正在尝试使用JSON.stringify将数组存储在localStorage中,但我得到了意想不到的结果。

这有效:

var links = {'one': 1, 'two': 2 };
var setstr = JSON.stringify(links);

localStorage.setItem('strlinks', setstr);
var getstr = localStorage.getItem('strlinks');
console.log(getstr); //Returns what's expected - '{"one":1, "two":2}'

这不是:

var links = $.makeArray($('a'));

alert(links); //Returns list of links
var setstr = JSON.stringify(links);

localStorage.setItem('strlinks', setstr);
var getstr = localStorage.getItem('strlinks');
console.log(getstr); //Returns '[]'

关于我做错了什么的想法?

2 个答案:

答案 0 :(得分:3)

links包含循环引用,因此无法将其序列化为JSON。 Chrome 5.0.375.99给出错误:

TypeError: Converting circular structure to JSON

您必须以某种方式删除这些循环引用。当然,这取决于您关心的信息。这是一个简化版本:

var flatLinks = $.map(links, function(el)
                             {
                              return {href: el.href, text: el.textContent};
                             }); 
var setstr = JSON.stringify(flatLinks);

答案 1 :(得分:0)

$('a')选择页面上的所有链接(HTMLAnchorElement s)。

元素是由它们在文档中的标识和存在定义的DOM节点。它们不是JSON可以表示的简单值。如果你看一下JSON.stringify()为它们返回的内容,它只是{}:JSON说它所知道的对象就是它Object

尝试将节点置于localStorage之内没有任何意义;当你明天阅读存储时,你期望什么回来?一个Node对象,它是用户昨天关闭和销毁的文档的一部分?

如果你想记住链接指向的位置,你应该从他们的href属性中获取String - 一个简单的值类型,localStorage可以安全地记住它