HTML5 localStorage 키 가져 오기


145

의 모든 키 값을 얻는 방법이 궁금합니다 localStorage.


간단한 JavaScript 루프로 값을 검색하려고했습니다.

for (var i=1; i <= localStorage.length; i++)  {
   alert(localStorage.getItem(i))
}

그러나 키가 1부터 시작하는 점진적인 숫자 인 경우에만 작동합니다.


사용 가능한 모든 데이터를 표시하려면 모든 키를 어떻게 얻습니까?




이 루프가 i = 1로 시작하고 i = localStorage.length로 끝나는 이유는 무엇입니까? 내가 테스트 한 브라우저 (Chrome)에서 루프는 0에서 시작하여 localStorage.length-1에서 끝나야합니다.
Louis LC

@LouisLC (관계형 데이터베이스의 기본 키와 같은) 키에 점진적 숫자를 사용했기 때문에
Simone

답변:


35

ES2017에서는 다음을 사용할 수 있습니다.

Object.entries(localStorage)

5
Object.keys()작품도 예상대로 작동 한다고 가정 합니까?

292
for (var key in localStorage){
   console.log(key)
}

편집 :이 답변은 많은 찬사를 받고 있으므로 일반적인 질문이라고 생각합니다. 나는 내 대답에 걸려 넘어 질지도 모르는 누군가에게 그것을 빚진 것 같은 느낌이 들었고 그것이 단지 업데이트를 받아 들여서 받아 들여 졌기 때문에 그것이 옳다고 생각한다. 진실은 위의 예가 실제로 올바른 방법 이 아니라는 것 입니다. 가장 안전하고 안전한 방법은 다음과 같습니다.

for ( var i = 0, len = localStorage.length; i < len; ++i ) {
  console.log( localStorage.getItem( localStorage.key( i ) ) );
}

이 링크에서 .... stackoverflow.com/questions/15313606/… ... 왜이 모든 이상한 방법을 사용하여 localStorage에 액세스합니까?

2
"가장 안전하고 안전한"코드에 대한 몇 가지 질문 : 1) 왜 localStorage.length직접 선언 하고 사용하지 않습니까? 2) 왜 for 루프 안에 선언해야합니까? 3) 왜 ++i선호 i++하는가?
Luciano Bargmann

8
실제로 시도 했습니까? ++i가장 확실하게 루프가 시작 되지 않습니다i = 1 . 괄호 안의 세 번째 표현식은 각 반복 후에 평가 됩니다. i++그리고 ++i모두에 동일한 영향을 i. 다른 점이다 ++i평가 i반면, 증가 후 i++평가하여의 값을 i 이전에 증가. 여기서 중요한 i것은 표현의 가치가 아니라 증분의 부작용이기 때문 입니다.
케빈 에니스

33
Object.keys(localStorage)IE <9를 지원할 필요가없는 한, 현재 는이 시나리오에서 완벽하게 작동 한다는 점에 주목할 가치가 있습니다.
Adrian

2
키 자체의 이름을 표시하려는 경우 localStorage.key( i )파트 를 사용하여이를 수행 할 수 있습니다 .
Sean Colombo

30

나는 이것처럼 쉽게 보이는 객체를 만들고 싶다.

Object.keys(localStorage).reduce(function(obj, str) { 
    obj[str] = localStorage.getItem(str); 
    return obj
}, {});

쿠키도 마찬가지입니다.

document.cookie.split(';').reduce(function(obj, str){ 
    var s = str.split('='); 
    obj[s[0].trim()] = s[1];
    return obj;
}, {});

1
객체를 반복하는 스타일이 마음에 듭니다.
Jonathan Stellwag

12
function listAllItems(){  
    for (i=0; i<=localStorage.length-1; i++)  
    {  
        key = localStorage.key(i);  
        alert(localStorage.getItem(key));
    }  
}

9

localStorage.key(index)함수를 사용하여 문자열 표현을 리턴 할 수 있습니다. 여기서 indexn 번째로 검색하려는 오브젝트가 있습니다.


7

브라우저가 HTML5 LocalStorage를 지원하는 경우 Array.prototype.map도 구현해야합니다.

Array.apply(0, new Array(localStorage.length)).map(function (o, i) {
    return localStorage.key(i);
})

new Array(this.localStorage.length).fill(0)apply imo를 사용하는 것보다 약간 덜 해로운 느낌을 줄 수도 있습니다 .
레니

6

질문은 키 찾기를 언급했기 때문에 모든 키와 값 쌍을 표시하기 위해 다음과 같이 할 수 있다고 언급했습니다 (Kevin의 답변을 기반으로).

for ( var i = 0, len = localStorage.length; i < len; ++i ) {
  console.log( localStorage.key( i ) + ": " + localStorage.getItem( localStorage.key( i ) ) );
}

"key : value"형식으로 데이터를 기록합니다.

(Kevin : 원하는 경우이 정보를 답변에 자유롭게 입력하십시오!)


1

localStorage의 모든 키와 값을 인쇄합니다.

ES6 :

for (let i=0; i< localStorage.length; i++) {
    let key = localStorage.key(i);
    let value = localStorage[key];
    console.log(`localStorage ${key}:  ${value}`);
}

1

다음과 같은 키와 값을 얻을 수 있습니다.

for (let [key, value] of Object.entries(localStorage)) {
  console.log(`${key}: ${value}`);
}

0

나는 케빈이 최선의 답변을하지만 때로는 같은 값을 가진 로컬 스토리지에 다른 키가있을 때 공개 사용자가 바구니에 항목을 몇 번 추가했는지 확인하기를 원할 때 여러 번 다음을 사용할 수도 있습니다.

var set = localStorage.setItem('key', 'value');
var element = document.getElementById('tagId');

for ( var i = 0, len = localStorage.length; i < len; ++i ) {
  element.innerHTML =  localStorage.getItem(localStorage.key(i)) + localStorage.key(i).length;
}

-1

Object.keys(localStorage)...를 사용하는 사람들 은 Firefox에서 작동하지 않기 때문에하지 마십시오 (철 새롭게 Firefox가 사양에 충실하기 때문에). 이걸 고려하세요:

localStorage.setItem("key", "value1")
localStorage.setItem("key2", "value2")
localStorage.setItem("getItem", "value3")
localStorage.setItem("setItem", "value4")

key, getItem 및 setItem은 프로토 타입이므로 메소드 Object.keys(localStorage)["key2"] 합니다.

다음과 같이하는 것이 가장 좋습니다 :

let t = [];
for (let i = 0; i < localStorage.length; i++) {
  t.push(localStorage.key(i));
}

@Darkrum Firefox가 스펙을 올바르게 따르기 때문에 사용하면 key, getItem 및 setItem이 누락됩니다 object.keys()... 반영하기 위해 답변을 업데이트합니다.
Mike Ratcliffe

로컬 스토리지 사양을 읽으면 언급 한 내용이 표시되지 않습니다.
Darkrum

그리고 object.keys ()의 스펙을 읽으면 Firefox가 말한 것이 사실이라면 그것을 버리지 않는 것처럼 보입니다.
다크 럼

@Darkrum에서 봐 html.spec.whatwg.org/multipage/... 당신은 스펙으로 IDL을 정의하는 것을 볼 수 있습니다 [Exposed=Window]. 이로 인해 내가 설명하는 동작이 발생합니다. 그것으로 지정되면 [Exposed=Window,OverrideBuiltins]우리가 기대하는 동작을 제공하지만 스펙 지정 하지 않습니다OverrideBuiltins . whatwg / html에서 여기에 대한 토론을 볼 수 있습니다 : github.com/whatwg/html/issues/183
Mike Ratcliffe

다시 말하지만 이것은 object.keys의 작동 방식과 관련이 없습니다. 설정을 허용하지 않는 Mozilla의 선택은 스펙을 해석하는 방법입니다. 분명히 다른 수단을 통해 변경되지 않는 프로토 타입이 자체 속성과 관련이없는 경우 프로토 타입을 변경하기 때문에 Google은 자신이하는 일을 분명히 알고있었습니다.
Darkrum

-3

이름으로도 읽을 수 있습니다.

다음과 같이 'user'라는 이름으로 값을 저장했다고 가정 해보십시오.

localStorage.setItem('user', user_Detail);

그럼 우리는 그것을 사용하여 읽을 수 있습니다

localStorage.getItem('user');

나는 그것을 사용했고 매끄럽게 작동하고 for 루프를 수행 할 필요가 없다.

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