2010-07-28 75 views
447

Nếu tôi không cần localStorage, mã của tôi sẽ trông như thế này:Làm cách nào để lưu trữ một mảng trong localStorage?

var names=new Array(); 
names[0]=prompt("New member name?"); 

này hoạt động. Tuy nhiên, tôi cần lưu trữ biến này trong localStorage và nó tỏ ra khá cứng đầu. Tôi đã thử:

var localStorage[names] = new Array(); 
localStorage.names[0] = prompt("New member name?"); 

Tôi sẽ làm gì sai?

+0

Tôi đã niêm yết công khai một giải pháp hoàn chỉnh cho việc duy trì mảng trong localStorage hoặc sessionStorage tại thread này đã bị đóng như một bản sao của, bởi vì nether chủ đề thực sự trả lời cho câu hỏi ban đầu được đặt ra bởi Dave: http://stackoverflow.com/a/23516713/2208713.Hy vọng nó sẽ giúp một số người. –

+0

Cách dễ dàng để xử lý loại tình trạng đó bạn có thể sử dụng thư viện opendb rất sử dụng đầy đủ để đối phó với mảng, đối tượng. Bạn có thể theo liên kết này https://github.com/pankajbisht/openDB – pankaj98

Trả lời

857

localStorage chỉ hỗ trợ chuỗi. Sử dụng JSON.stringify()JSON.parse().

var names = []; 
names[0] = prompt("New member name?"); 
localStorage.setItem("names", JSON.stringify(names)); 

//... 
var storedNames = JSON.parse(localStorage.getItem("names")); 
+3

JSON không được hỗ trợ trong IE7 trở về trước. –

+280

@SaifBechan Đừng lo lắng về IE 6/7, chúng ta đang nói về 'localStorage' – tungd

+5

Ai đó có thể giải thích tại sao bạn phải làm điều này và những gì đang diễn ra? –

15

Sử dụng JSON.stringify()JSON.parse() như được đề xuất bởi không! Điều này ngăn sự cố có thể hiếm gặp nhưng có thể xảy ra của tên thành viên bao gồm dấu phân tách (ví dụ: tên thành viên three|||bars).

+0

Bạn có thể cho chúng tôi thấy một giải pháp thay thế tốt hơn không? – Phil

+3

Điều này không cung cấp câu trả lời cho câu hỏi. Để phê bình hoặc yêu cầu làm rõ từ tác giả, hãy để lại nhận xét bên dưới bài đăng của họ. – ChiefTwoPencils

+0

@ChiefTwoPencils bạn có đọc nhận xét trước khi gắn cờ không? – J0HN

4

Một giải pháp sẽ được để viết một wrapper mà lưu trữ các mảng như thế này:

localStorage.setItem('names_length', names.length); 
localStorage.setItem('names_0', names[0]); 
localStorage.setItem('names_1', names[1]); 
localStorage.setItem('names_' + n, names[n]); 

Loại bỏ các chi phí chuyển đổi để JSON, nhưng sẽ gây phiền nhiễu nếu bạn cần phải loại bỏ các yếu tố, như bạn sẽ phải tái chỉ mục mảng :)

+0

Giết được hiệu suất đạt được không JSONifying. –

+0

@CamiloMartin Vâng, điều đó có thể đúng .. :) – Znarkus

+1

Thay vì 'names_length' sử dụng' names_keys' và bạn không cần phải lập chỉ mục lại! Điều này cũng sẽ cho phép bạn sử dụng các phím chuỗi. Tất nhiên điều này chỉ có ý nghĩa nếu các yếu tố mảng là loại hugh. – PiTheNumber

91

localStoragesessionStorage chỉ có thể xử lý chuỗi. Bạn có thể mở rộng các đối tượng lưu trữ mặc định để xử lý các mảng và các đối tượng. Chỉ cần bao gồm kịch bản này và sử dụng các phương pháp mới:

Storage.prototype.setObj = function(key, obj) { 
    return this.setItem(key, JSON.stringify(obj)) 
} 
Storage.prototype.getObj = function(key) { 
    return JSON.parse(this.getItem(key)) 
} 

Sử dụng localStorage.setObj(key, value) để lưu một mảng hoặc đối tượng và localStorage.getObj(key) để lấy nó. Các phương thức tương tự cũng hoạt động với đối tượng sessionStorage.

Nếu bạn chỉ sử dụng các phương pháp mới để truy cập bộ nhớ, mọi giá trị sẽ được chuyển thành chuỗi JSON trước khi lưu và phân tích cú pháp trước khi nó được trả về bởi getter.

Nguồn: http://www.acetous.de/p/152

+0

nếu bạn cần tất cả chúng như thế nào bạn sẽ lấy chúng? –

+0

Các đối tượng lưu trữ cung cấp thuộc tính "length" để xác định số lượng đối tượng đã lưu và phương thức "key (int index)" để lấy khóa hiện tại. Vì vậy, bạn có thể thử: 'cho (var i = 0; i Sebastian

+1

@Sebastian sử dụng ** localStorage.length ** có thể sai trong một số trường hợp nếu trang web cũng là ** localStorage ** để lưu trữ thứ gì đó. –

3

Phương pháp JSON hoạt động, trên tức là 7 bạn cần json2.js, với nó nó hoạt động một cách hoàn hảo và mặc dù một bình luận nói rằng nếu không là localStorage trên đó. nó thực sự có vẻ như giải pháp tốt nhất với ít rắc rối nhất. Tất nhiên, người ta có thể viết kịch bản để làm cơ bản giống như json2 nhưng có rất ít điểm trong đó.

ít nhất với chuỗi phiên bản sau có localStorage, nhưng như đã nói bạn cần bao gồm json2.js vì không được trình duyệt tự bao gồm: 4.0 (tương thích; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; BRI/2; NP06; .NET4.0C; .NET4.0E; Zune 4.7) (Tôi sẽ đã làm cho nhận xét này về câu trả lời, nhưng không thể).

5

Chỉ cần tạo này:

https://gist.github.com/3854049

//Setter 
Storage.setObj('users.albums.sexPistols',"blah"); 
Storage.setObj('users.albums.sexPistols',{ sid : "My Way", nancy : "Bitch" }); 
Storage.setObj('users.albums.sexPistols.sid',"Other songs"); 

//Getters 
Storage.getObj('users'); 
Storage.getObj('users.albums'); 
Storage.getObj('users.albums.sexPistols'); 
Storage.getObj('users.albums.sexPistols.sid'); 
Storage.getObj('users.albums.sexPistols.nancy'); 
+2

Đây là thứ tôi đang tìm kiếm, ngoại trừ nó sẽ đi các khóa của đối tượng được cung cấp và lưu giá trị được liên kết (đơn) trong mỗi đối tượng. Phần lớn có nghĩa vụ truyền cảm hứng. – twobob

Các vấn đề liên quan