HTML5 및 JavaScript에서 localStorage를 통해 반복


94

그래서 길이가 있기 때문에 일반 객체처럼 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작업을 수행합니다.


답변:


144

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 앱용입니다.
Oscar Godson

빠른 질문입니다. JSON에 어떻게 추가합니까? 예를 들어, "Dolor"뒤에 "hello"를 어떻게 추가합니까?
Oscar Godson

1
보기 만해도 작동 할 것입니다. eval이 아닌 parse를 사용해야하는 이유가 있습니까? 지금 eval을 사용하여 문자열에서 가져 오지만 구문 분석이 더 빠르고 빠릅니까?
Oscar Godson

1
@Oscar parse는 코드 실행으로부터 사용자를 보호하므로 더 안전합니다. 그리고 종종 훨씬 더 빠릅니다. blog.mozilla.com/webdev/2009/02/12/native-json-in-firefox-31
Matthew Flaschen

1
@BBagi, 디코딩 된 입력이 무엇이든 반환합니다. JSON 텍스트의 최상위 수준은 개체 또는 배열 일 수 있습니다. 시도JSON.parse('["Lorem", "Ipsum", "Dolor"]').length
Matthew Flaschen 2013-04-20

34

가장 간단한 방법은 다음과 같습니다.

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를 사용합니다. 크롬 js 콘솔에서 이것을 시도 할 수 있습니까? for(var key in localStorage) { console.log(localStorage.getItem(key)); }
jtblin 2013

난 그냥 그것을 시도 @jtblin, 그것은 반환 TypeError: Cannot call method 'toString' of null내가 '키'널 (null)을 반환 가정, 그래서
후안 카를로스 Alpizar 친칠라

1
이것은 크롬, 사파리와 파이어 폭스의 최신 버전에서 작동
mndrix

1
@JuanCarlosAlpizarChinchilla 코드에 'toString'이 없으므로 ¯_ (ツ) _ / ¯. 위의 주석에서 지적했듯이 모든 최신 브라우저에서 잘 작동합니다.
jtblin

내 의견은, 두 살입니다 @jtblin 그래서 머리를하지만 대응 _ (ツ) _ / ¯ 감사
후안 카를로스 Alpizar 친칠라

1

이전 답변을 바탕으로 키 값을 모르고 키별로 로컬 저장소를 반복하는 기능이 있습니다.

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

콘솔 출력을 살펴보면 코드에 의해 추가 된 항목에 모두 typeof 문자열이있는 것을 볼 수 있습니다. 내장 항목은 함수 {[native code]}이거나 길이 속성의 경우 숫자입니다. typeofKey 변수를 사용하여 문자열 만 필터링하여 항목 만 표시 할 수 있습니다.

숫자 또는 부울 값을 모두 문자열로 저장하기 때문에 값으로 저장하더라도 작동합니다.


1

이 모든 답변은 브라우저 간 localStorage 구현 간의 차이점을 무시합니다. 이 도메인의 기여자는 설명하고있는 플랫폼에 대한 응답을 엄격하게 한정해야합니다. 하나의 브라우저 전체 구현은 https://developer.mozilla.org/en/docs/Web/API/Window/localStorage에 문서화되어 있으며 매우 강력하지만 몇 가지 핵심 메서드 만 포함합니다. 내용을 반복하려면 개별 브라우저에 특정한 구현을 이해해야합니다.


이 답변 중 하나가 브라우저에서 작동하지 않는 방법에 대한 예를 들어 주시겠습니까? 이것은 오래 전하지만, 나는이 답변을 통해 루프와 함께 문제로 실행 기억하지 않는다
오스카 대자

내 댓글을이 특정 게시물이 아닌 전체 스트림에 추가하려고했으며 약간 거칠었을 수 있습니다. 브라우저 간 솔루션을 찾으려고 할 때 실망했습니다. for (localStorage의 var key) {typeofKey = (typeof localStorage [key]);를 포함하는 Steve Isenberg (아래)의 예입니다. 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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.