Nhận khóa HTML5 localStorage


145

Tôi chỉ tự hỏi làm thế nào để có được tất cả các giá trị quan trọng localStorage.


Tôi đã cố gắng truy xuất các giá trị bằng một vòng lặp JavaScript đơn giản

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

Nhưng nó chỉ hoạt động nếu các khóa là số lũy tiến, bắt đầu từ 1.


Làm cách nào để có được tất cả các phím, để hiển thị tất cả dữ liệu có sẵn?



bản sao có thể có của stackoverflow.com/questions/3138564/ Lời
kubetz

Tại sao vòng lặp này bắt đầu bằng i = 1 và kết thúc bằng i = localStorage.length? Trong các trình duyệt tôi đã thử nghiệm (Chrome), vòng lặp sẽ bắt đầu từ 0 và kết thúc tại localStorage.length - 1 ...
Louis LC

@LouisLC vì tôi đang sử dụng các số lũy tiến cho các khóa của mình (như khóa chính trong cơ sở dữ liệu quan hệ).
Simone

Câu trả lời:


35

trong ES2017 bạn có thể sử dụng:

Object.entries(localStorage)

5
và tôi giả sử Object.keys()làm việc như mong đợi là tốt?

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

EDIT: câu trả lời này đang nhận được rất nhiều sự ủng hộ, vì vậy tôi đoán đó là một câu hỏi phổ biến. Tôi cảm thấy như mình nợ nó với bất kỳ ai có thể vấp phải câu trả lời của tôi và nghĩ rằng nó "đúng" chỉ vì nó được chấp nhận để thực hiện cập nhật. Sự thật là, ví dụ trên không thực sự là cách đúng đắn để làm điều này. Cách tốt nhất và an toàn nhất là làm như thế này:

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

Trong liên kết này .... stackoverflow.com/questions/15313606/ trên ... tại sao họ sử dụng tất cả các phương thức lạ này để truy cập localStorage?

2
Một số câu hỏi cho mã "tốt nhất / an toàn nhất": 1) Tại sao phải khai báo localStorage.lengthvà không sử dụng trực tiếp? 2) Tại sao khai báo nó bên trong vòng lặp for? 3) Tại sao ++iđược ưa thích hơn i++?
Luciano Bargmann

8
Bạn đã thực sự thử nó? ++ichắc chắn nhất không làm cho vòng lặp bắt đầu tại i = 1. Biểu thức thứ ba bên trong dấu ngoặc đơn được đánh giá sau mỗi lần lặp. i++++icả hai đều có tác dụng chính xác như nhau trên i. Sự khác biệt là ++iđánh giá giá trị mớii sau khi tăng, trong khi i++đánh giá giá trị i trước khi tăng. Nó hoàn toàn không có sự khác biệt ở đây, bởi vì tất cả những gì chúng ta quan tâm là tác dụng phụ của việc tăng i, chứ không phải giá trị của biểu thức.
Kevin Enni

33
Điều đáng chú ý là ngày nay Object.keys(localStorage)hoạt động hoàn toàn tốt cho kịch bản này, miễn là bạn không cần hỗ trợ IE <9
Adrian

2
Cũng hữu ích cần lưu ý là nếu bạn muốn hiển thị tên của chính khóa, bạn có thể làm điều đó với localStorage.key( i )một phần.
Sean Colombo

29

Tôi muốn tạo ra một đối tượng dễ nhìn thấy từ nó như thế này.

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

Tôi cũng làm một điều tương tự với cookie.

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

1
Tôi thích phong cách lặp đi lặp lại trên các đối tượng.
Jonathan Stellwag

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

9

Bạn có thể sử dụng localStorage.key(index)hàm để trả về chuỗi đại diện, indexđối tượng thứ n mà bạn muốn lấy.


7

Nếu trình duyệt hỗ trợ HTML5 LocalStorage, nó cũng sẽ triển khai Array.prototype.map, cho phép điều này:

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

Bạn cũng có thể làm điều new Array(this.localStorage.length).fill(0)đó cảm thấy ít hack hơn so với sử dụng imo áp dụng.
Lenny

6

Vì câu hỏi đề cập đến việc tìm khóa, tôi đoán rằng tôi muốn đề cập rằng để hiển thị mọi cặp khóa và giá trị, bạn có thể làm như thế này (dựa trên câu trả lời của Kevin):

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

Điều này sẽ ghi lại dữ liệu theo định dạng "key: value"

(Kevin: cứ thoải mái đưa thông tin này vào câu trả lời của bạn nếu bạn muốn!)


1

Điều này sẽ in tất cả các khóa và giá trị trên 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

Bạn có thể nhận được các khóa và giá trị như thế này:

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

0

Tôi đồng ý với Kevin anh ấy có câu trả lời hay nhất nhưng đôi khi khi bạn có các khóa khác nhau trong bộ nhớ cục bộ của mình với cùng một giá trị, ví dụ bạn muốn người dùng công khai của bạn xem họ đã thêm các mục của họ vào giỏ bao nhiêu lần, bạn cần cho họ xem số lần là tốt sau đó bạn ca sử dụng này:

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

Đối với những người đề cập đến việc sử dụng Object.keys(localStorage)... đừng vì nó sẽ không hoạt động trong Firefox (trớ trêu thay vì Firefox trung thành với thông số kỹ thuật). Xem xét điều này:

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

Bởi vì khóa, getItem và setItem là các phương thức nguyên mẫu Object.keys(localStorage)sẽ chỉ trả về ["key2"].

Bạn tốt nhất để làm một cái gì đó như thế này:

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

@Darkrum Vì Firefox tuân theo thông số kỹ thuật chính xác, khóa, getItem và setItem sẽ bị thiếu nếu bạn sử dụng object.keys()... Tôi sẽ cập nhật câu trả lời của mình để phản ánh điều đó.
Mike Ratcliffe

Chỉ cần đọc thông số kỹ thuật cho bộ nhớ cục bộ và tôi không thấy những gì bạn đề cập.
Darkrum

Và đọc thông số kỹ thuật cho object.keys () có vẻ như Firefox là thứ không thể bỏ qua nếu điều bạn nói là đúng.
Darkrum

@Darkrum Hãy xem html.spec.whatwg.org/multipage/ , và bạn có thể thấy rằng thông số kỹ thuật xác định IDL với [Exposed=Window]. Điều này dẫn đến hành vi tôi mô tả. Nếu nó được chỉ định với [Exposed=Window,OverrideBuiltins]nó sẽ đưa ra hành vi mà chúng ta mong đợi nhưng thông số kỹ thuật không chỉ định OverrideBuiltins. Bạn có thể xem một cuộc thảo luận về nó trong whatwg / html tại đây: github.com/whatwg/html/issues/183
Mike Ratcliffe

Một lần nữa vì tôi sẽ nói điều này không liên quan gì đến cách hoạt động của object.keys. Sự lựa chọn của Mozillas không cho phép chúng được thiết lập là cách chúng diễn giải thông số kỹ thuật. Rõ ràng Google biết họ đang làm gì vì nguyên mẫu không thể thay đổi trừ khi được thực hiện cụ thể thông qua các phương tiện khác có liên quan gì đến các thuộc tính riêng.
Darkrum

-3

Chúng tôi cũng có thể đọc theo tên.

Giả sử chúng tôi đã lưu giá trị với tên 'người dùng' như thế này

localStorage.setItem('user', user_Detail);

Sau đó chúng ta có thể đọc nó bằng cách sử dụng

localStorage.getItem('user');

Tôi đã sử dụng nó và nó đang hoạt động trơn tru, không cần phải thực hiện vòng lặp for

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.