Vòng qua localStorage trong HTML5 và JavaScript


92

Vì vậy, tôi đã nghĩ rằng mình có thể lặp qua localStorage như một đối tượng bình thường vì nó có chiều dài. Làm thế nào tôi có thể lặp lại điều này?

localStorage.setItem(1,'Lorem');
localStorage.setItem(2,'Ipsum');
localStorage.setItem(3,'Dolor');

Nếu tôi làm một, localStorage.lengthnó trả về 3là chính xác. Vì vậy, tôi giả sử một for...invòng lặp sẽ hoạt động.

Tôi đã nghĩ một cái gì đó như:

for (x in localStorage){
    console.log(localStorage[x]);
}

Nhưng vô ích. Bất kỳ ý tưởng?

Ý tưởng khác mà tôi có là một cái gì đó giống như

localStorage.setItem(1,'Lorem|Ipsum|Dolor')
var split_list = localStorage.getItem(1).split('|');

Trong đó for...incông việc.


Câu trả lời:


143

Bạn có thể sử dụng keyphương pháp này. localStorage.key(index)trả về indexkhóa thứ (thứ tự được xác định bởi việc triển khai nhưng không đổi cho đến khi bạn thêm hoặc xóa khóa).

for (var i = 0; i < localStorage.length; i++){
    $('body').append(localStorage.getItem(localStorage.key(i)));
}

Nếu thứ tự quan trọng, bạn có thể lưu trữ một mảng được tuần tự hóa JSON:

localStorage.setItem("words", JSON.stringify(["Lorem", "Ipsum", "Dolor"]));

Thông số kỹ thuật dự thảo tuyên bố rằng bất kỳ đối tượng nào hỗ trợ bản saocấu trúc đều có thể là một giá trị. Nhưng điều này dường như chưa được hỗ trợ.

CHỈNH SỬA: Để tải mảng, hãy thêm vào nó, sau đó lưu trữ:

var words = JSON.parse(localStorage.getItem("words"));
words.push("hello");
localStorage.setItem("words", JSON.stringify(words));

Cảm ơn rất nhiều! Đây chỉ là những gì tôi đang tìm kiếm. Tôi cũng sẽ xem xét thứ JSON mà bạn đã gửi. Đó là hoàn hảo. Nó dành cho một ứng dụng iOS HTML5 ngoại tuyến dành cho tên trẻ em.
Oscar Godson

Câu hỏi nhanh, tôi sẽ thêm JSON đó như thế nào? Giống như, làm cách nào để thêm "xin chào" sau "Dolor"?
Oscar Godson

1
bạn rock, chỉ cần nhìn vào, nó sẽ hoạt động. Có lý do gì tôi nên sử dụng phân tích cú pháp chứ không phải đánh giá? Bây giờ tôi đang sử dụng eval để lấy nó từ một chuỗi, nhưng phân tích cú pháp có tốt hơn / nhanh hơn không?
Oscar Godson

1
@Oscar, parsean toàn hơn vì nó bảo vệ bạn khỏi việc thực thi mã. Và thường, nó cũng nhanh hơn nhiều. Xem blog.mozilla.com/webdev/2009/02/12/native-json-in-firefox-31
Matthew Flaschen

1
@BBagi, nó trả về bất kỳ thứ gì đầu vào, được giải mã. Cấp cao nhất của văn bản JSON có thể là một đối tượng hoặc mảng. Hãy thửJSON.parse('["Lorem", "Ipsum", "Dolor"]').length
Matthew Flaschen

32

Cách đơn giản nhất là:

Object.keys(localStorage).forEach(function(key){
   console.log(localStorage.getItem(key));
});

24

Ngoài tất cả các câu trả lời khác, bạn có thể sử dụng $ .each chức năng từ thư viện jQuery:

$.each(localStorage, function(key, value){

  // key magic
  // value magic

});

Cuối cùng, lấy đối tượng với:

JSON .parse (localStorage.getItem (localStorage.key (key)));


2
Điều này chỉ hoạt động nếu bạn đang sử dụng jQuery. $được sử dụng cho các thư viện khác và cũng thường được dùng làm bí danh cho document.querySelectorAll. Câu hỏi cũng không được gắn thẻ là câu hỏi [jquery].
AnnanFay

9

Điều này phù hợp với tôi trong Chrome:

for(var key in localStorage) {
  $('body').append(localStorage.getItem(key));
}

1
Chính xác là phần nào? Đoạn mã này sử dụng jQuery theo câu hỏi ban đầu. Bạn có thể thử điều này trong bảng điều khiển chrome js không? for(var key in localStorage) { console.log(localStorage.getItem(key)); }
jtblin

@jtblin Tôi chỉ cố gắng nó, nó quay trở lại TypeError: Cannot call method 'toString' of null, vì vậy tôi giả định 'chìa khóa' đang trở lại rỗng
Juan Carlos Alpizar Chinchilla

1
Điều này hoạt động trong các phiên bản gần đây của Chrome, Safari và Firefox
mndrix 19/07/2016

1
@JuanCarlosAlpizarChinchilla không có 'toString' trong mã nên ¯_ (ツ) _ / ¯. Như đã chỉ ra trong nhận xét ở trên, hoạt động tốt trong tất cả các trình duyệt gần đây.
jtblin

@jtblin bình luận của tôi là hai tuổi, vì vậy _ (ツ) _ / ¯ cảm ơn cho người đứng đầu lên mặc dù
Juan Carlos Alpizar Chinchilla

1

Dựa trên câu trả lời trước ở đây là một hàm sẽ lặp qua bộ lưu trữ cục bộ bằng khóa mà không cần biết các giá trị khóa.

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

Nếu bạn kiểm tra đầu ra bảng điều khiển, bạn sẽ thấy các mục được mã của bạn thêm vào tất cả đều có một chuỗi kiểu. Trong khi các mục tích hợp là hàm {[mã gốc]} hoặc trong trường hợp thuộc tính độ dài là một số. Bạn có thể sử dụng biến typeofKey để lọc ngay trên các chuỗi để chỉ các mục của bạn được hiển thị.

Lưu ý rằng điều này hoạt động ngay cả khi bạn lưu trữ một số hoặc boolean dưới dạng giá trị vì cả hai đều được lưu trữ dưới dạng chuỗi.


1

Tất cả các câu trả lời này đều bỏ qua sự khác biệt giữa việc triển khai localStorage trên các trình duyệt. Các cộng tác viên trong miền này phải đủ điều kiện phản hồi của họ với nền tảng mà họ đang mô tả. Một triển khai trên toàn trình duyệt được ghi lại tại https://developer.mozilla.org/en/docs/Web/API/Window/localStorage và mặc dù rất mạnh mẽ nhưng chỉ chứa một vài phương pháp cốt lõi. Lặp qua các nội dung yêu cầu hiểu biết về việc triển khai cụ thể cho các trình duyệt riêng lẻ.


Bạn có thể cho một ví dụ về cách một trong những câu trả lời này sẽ không hoạt động trên trình duyệt không? Đây là một thời gian dài trước đây, nhưng tôi không nhớ chạy vào bất kỳ vấn đề với vòng lặp thông qua với những câu trả lời
Oscar Godson

Tôi dự định nhận xét của mình sẽ được thêm vào luồng tổng thể, không phải bài đăng cụ thể này và có thể hơi gay gắt. Vào thời điểm đó, tôi đã rất thất vọng khi cố gắng tìm giải pháp cho nhiều trình duyệt. Ví dụ của Steve Isenberg (bên dưới) chứa for (var key trong localStorage) {typeofKey = (typeof localStorage [key]); console.log (key, typeofKey); } Không hoạt động trên triển khai webKit (hãy thử!)
StarTraX

Điều này hoạt động: for (var i = 0; i <localStorage.length; ++ i) {console.log (localStorage.key (i) + ":" + localStorage.getItem (localStorage.key (i))); }
StarTraX

1

localStoragelà một Object.

Chúng ta có thể lặp qua nó với JavaScript for / in Statement giống như bất kỳ Object nào khác.

Và chúng tôi sẽ sử dụng .getItem()để truy cập giá trị của mỗi khóa (x).

for (x in localStorage){
    console.log(localStorage.getItem(x));
}
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.