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動作します。


回答:


143

keyメソッドを使用できます。 th番目のキーを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ではなくparseを使用する理由はありますか?文字列から取得するためにevalを使用していますが、解析の方が優れていますか?
オスカーゴッドソン

1
@Oscarは、parseコード実行からユーザーを保護するため、より安全です。そして、多くの場合、それははるかに高速です。参照してくださいblog.mozilla.com/webdev/2009/02/12/native-json-in-firefox-31
マシューFlaschen

1
@BBagi、入力が何であれ、デコードして返します。JSONテキストの最上位は、オブジェクトまたは配列です。試してみるJSON.parse('["Lorem", "Ipsum", "Dolor"]').length
マシューフラッシェン2013


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を使用します。これをクロムjsコンソールで試すことができますか?for(var key in localStorage) { console.log(localStorage.getItem(key)); }
jtblin 2013

@jtblin試してみたところ、返されたTypeError: Cannot call method 'toString' of nullので、 'key'がnullを返していると思います
Juan Carlos Alpizar Chinchilla 14

1
これは最近のバージョンのChrome、Safari、Firefoxで機能します
mndrix

1
@JuanCarlosAlpizarChinchillaコードには「toString」がないため、so_(ツ)_ /¯です。上記のコメントで指摘したように、最近のすべてのブラウザーで正常に動作します。
jtblin

@jtblin私のコメントは2歳なので、¯_(ツ)_ /¯頭を上げてくれてありがとう
ファンカルロス

1

ここでの前の答えに基づいて構築されているのは、キーの値を知らなくても、キーによってローカルストレージをループする関数です。

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

コンソール出力を調べると、コードによって追加された項目にはすべてtypeof文字列があることがわかります。一方、組み込みアイテムは関数{[ネイティブコード]}、またはlengthプロパティの場合は数値のいずれかです。typeofKey変数を使用して、文字列のみでフィルタリングして、アイテムのみが表示されるようにすることができます。

数値またはブール値を両方とも文字列として保存しているため、値として保存してもこれは機能することに注意してください。


1

これらの回答はすべて、ブラウザ間でのlocalStorageの実装の違いを無視しています。このドメインのコントリビューターは、彼らが説明しているプラ​​ットフォームを使用して、自分の応答を大幅に修飾する必要があります。ブラウザ全体の実装の1つは、https://developer.mozilla.org/en/docs/Web/API/Window/localStorageに記載されて おり、非常に強力ですが、いくつかのコアメソッドしか含まれていません。コンテンツをループするには、個々のブラウザーに固有の実装を理解する必要があります。


これらの答えの1つがブラウザで機能しない例を挙げていただけますか?これは長い時間前でしたが、私はこれらの答えとをループですべての問題に実行して覚えていない
オスカーゴッドソン

この特定の投稿ではなく、ストリーム全体にコメントを追加するつもりだったので、少し厳しいかもしれません。当時、クロスブラウザソリューションを見つけようとしていました。Steve Isenbergによる例(下記)for(varStorage in localStorage){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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.