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.