在HTML5和JavaScript中循环遍历localStorage


92

因此,我想我可以像普通对象一样遍历localStorage,因为它具有长度。我该如何循环?

localStorage.setItem(1,'Lorem');
localStorage.setItem(2,'Ipsum');
localStorage.setItem(3,'Dolor');

如果我这样做,localStorage.length则返回3正确的结果。所以我认为for...in循环会起作用。

我在想类似的东西:

for (x in localStorage){
    console.log(localStorage[x]);
}

但无济于事。有任何想法吗?

我的另一个想法是

localStorage.setItem(1,'Lorem|Ipsum|Dolor')
var split_list = localStorage.getItem(1).split('|');

在其中for...in工作。


Answers:


143

您可以使用该key方法。 localStorage.key(index)返回index第一个键(顺序是实现定义的,但是在添加或删除键之前是恒定的)。

for (var i = 0; i < localStorage.length; i++){
    $('body').append(localStorage.getItem(localStorage.key(i)));
}

如果顺序很重要,则可以存储JSON序列化数组:

localStorage.setItem("words", JSON.stringify(["Lorem", "Ipsum", "Dolor"]));

规范草案声称,任何支持结构化克隆的对象都可以是一个值。但这似乎尚不支持。

编辑:要加载数组,添加到它,然后存储:

var words = JSON.parse(localStorage.getItem("words"));
words.push("hello");
localStorage.setItem("words", JSON.stringify(words));

非常感谢!这就是我想要的。我将调查您发送的JSON内容。那太完美了。适用于婴儿名字离线HTML5 iOS应用。
奥斯卡·戈德森

快速提问,我将如何添加到该JSON?就像,如何在“ Dolor”之后添加“ hello”?
奥斯卡·戈德森

1
你摇晃,只是看着,它应该工作。我应该使用解析而不是eval吗?我现在正在使用eval从字符串中获取它,但是解析得更好/更快吗?
奥斯卡·戈德森

1
@Oscar parse更加安全,因为它可以保护您免于执行代码。而且通常,它也更快。参见blog.mozilla.com/webdev/2009/02/12/native-json-in-firefox-31
Matthew Flaschen 2010年

1
@BBagi,它将返回输入解码后的内容。JSON文本的顶层可以是对象或数组。试试JSON.parse('["Lorem", "Ipsum", "Dolor"]').length
Matthew Flaschen

32

最简单的方法是:

Object.keys(localStorage).forEach(function(key){
   console.log(localStorage.getItem(key));
});

24

除了所有其他答案,您还可以使用jQuery库中的$ .each函数

$.each(localStorage, function(key, value){

  // key magic
  // value magic

});

最终,使用以下方法获取对象:

JSON .parse(localStorage.getItem(localStorage.key(key)));


2
这仅在使用jQuery时有效。$用于其他库,也经常用作的别名document.querySelectorAll。该问题也未标记为[jquery]问题。
AnnanFay

9

这在Chrome中对我有效:

for(var key in localStorage) {
  $('body').append(localStorage.getItem(key));
}

1
到底哪一部分?此代码段按照原始问题使用jQuery。您可以在chrome js控制台中尝试吗?for(var key in localStorage) { console.log(localStorage.getItem(key)); }
jtblin

@jtblin我刚刚尝试了它,它返回了TypeError: Cannot call method 'toString' of null,所以我假设'key'返回的是null
Juan Carlos Alpizar Chinchilla 2014年

1
此功能适用于Chrome,Safari和Firefox的最新版本
mndrix

1
@JuanCarlosAlpizarChinchilla代码中没有'toString',所以__(ツ)_ /¯。就像上面的评论中指出的那样,在所有最新的浏览器中都可以正常工作。
jtblin

@jtblin我的评论已经两岁了,所以__(ツ)_ /¯谢谢你的抬头
Juan Carlos Alpizar Chinchilla

1

在此之前的答案的基础上,该函数将在不知道键值的情况下通过键在本地存储中循环。

function showItemsByKey() {
   var typeofKey = null;
   for (var key in localStorage) {
       typeofKey = (typeof localStorage[key]);
       console.log(key, typeofKey);
   }
}

如果检查控制台输出,您将看到代码中添加的所有项目都具有typeof字符串。内置项是功能{[native code]},或者在length属性的情况下为数字。您可以使用typeofKey变量仅对字符串进行过滤,以便仅显示您的项目。

请注意,即使您将数字或布尔值存储为值,这也可行,因为它们都存储为字符串。


1

所有这些答案都忽略了跨浏览器的localStorage实现之间的差异。该领域的贡献者应充分利用他们所描述的平台来限定他们的回答。https://developer.mozilla.org/en/docs/Web/API/Window/localStorage记录了一种浏览器范围的实现 ,尽管功能非常强大,但仅包含一些核心方法。遍历内容需要了解特定于各个浏览器的实现。


您能否举例说明这些答案之一在浏览器上不起作用?这是很久以前的事了,但我不记得遇到这些循环遍历的问题了
Oscar Godson

我希望将我的评论添加到总体信息流中,而不是在此特定帖子中添加,并且可能有些刺耳。当时我很沮丧地试图找到一个跨浏览器的解决方案。史蒂夫·伊森伯格(Steve Isenberg)的示例(如下)包含for(localStorage中的var key){typeofKey =(typeof localStorage [key]); console.log(key,typeofKey); }在webKit实现上不起作用(尝试!)
StarTraX

这确实起作用:for(var i = 0; i <localStorage.length; ++ i){console.log(localStorage.key(i)+“:” + localStorage.getItem(localStorage.key(i))); }
StarTraX 2016年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.