2010-07-28 84 views
447

如果我並不需要本地存儲,我的代碼是這樣的:如何在localStorage中存儲數組?

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

這工作。但是,我需要將此變量存儲在localStorage中,並且證明它非常固執。我試過了:

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

我哪裏錯了?

+0

我已經發布了用於維持的localStorage或sessionStorage的陣列,在螺紋這被停課時重複一個完整的解決方案,因爲幽冥線程真正回答Dave最初提出的問題:http://stackoverflow.com/a/23516713/2208713。希望它能幫助一些人。 – 2014-05-07 11:37:17

+0

簡單的方法來處理這種情況,你可以使用opendb庫很全用來處理數組,對象。您可以按照此鏈接https://github.com/pankajbisht/openDB – pankaj98 2018-01-24 10:58:26

回答

857

localStorage只支持字符串。使用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

IE7及更早版本不支持JSON。 – 2011-11-22 08:44:30

+280

@SaifBechan不要擔心IE 6/7,我們正在討論'localStorage' – tungd 2012-01-10 04:40:13

+5

有人可以解釋爲什麼你必須這樣做,以及發生了什麼? – 2013-02-26 06:08:41

15

使用JSON.stringify()JSON.parse()由不建議!這可以防止包含分隔符的成員名稱(例如,成員名稱three|||bars)的可能罕見但可能出現的問題。

+0

你能告訴我們一個更好的選擇嗎? – Phil 2013-06-19 14:35:29

+3

這不提供問題的答案。要批評或要求作者澄清,請在其帖子下方留言。 – ChiefTwoPencils 2014-07-12 09:20:18

+0

@ChiefTwoPencils在標記之前是否閱讀過評論? – J0HN 2014-07-12 10:37:19

4

另一個解決方案是編寫存儲陣列像這樣的包裝:

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

刪除轉換成JSON的開銷,但如果你需要刪除內容將是惱人的,因爲你將不得不重新索引數組:)

+0

殺死不是JSONifying的性能增益。 – 2012-02-23 15:05:04

+0

@CamiloMartin是的,這可能是真的.. :) – Znarkus 2012-02-23 19:15:01

+1

而不是'names_length'使用'names_keys',你不需要重新索引!這也可以讓你使用字符串鍵。當然這隻有在數組元素是休息時纔有意義。 – PiTheNumber 2013-08-26 18:26:17

91

localStoragesessionStorage只能處理字符串。您可以擴展默認的存儲對象來處理數組和對象。只是包含這個腳本,並使用新的方法:

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

使用localStorage.setObj(key, value)保存一個數組或對象和localStorage.getObj(key)進行檢索。相同的方法與sessionStorage對象一起使用。

如果您只是使用新方法訪問存儲,則在保存並解析之前,每個值都將轉換爲JSON字符串,然後由getter返回。

來源:http://www.acetous.de/p/152

+0

如果你需要他們所有人,你會如何檢索他們? – 2013-11-16 23:29:27

+0

存儲對象提供屬性「length」來確定保存對象的計數以及獲取當前密鑰的方法「key(int index)」。所以你可以試試: 'for(var i = 0;我 Sebastian 2013-12-05 11:55:46

+1

@Sebastian使用** localStorage.length **在某些情況下可能是錯誤的,如果網站也是** localStorage **來存儲的東西。 – 2014-06-11 09:06:24

3

的JSON方法工作,在IE 7則需要json2.js,它它完美的作品,儘管有一個評論說,否則有localStorage的就可以了。它真的看起來像是最簡單的解決方案。當然,人們可以編寫腳本來完成與json2基本相同的功能,但是其中沒有什麼意義。

至少有以下版本字符串沒有本地存儲,但說你需要包括json2.js,因爲這不是由瀏覽器本身包括: 4.0(兼容; 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; .NET 4.0C; .NET 4.0E; Zune 4.7) (I would已經對此回覆發表了評論,但不能)。

5

就創造了這個:

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

這是我一直在尋找的東西,除非它會走提供的對象的鍵並將每個(單個)鏈接值保存在每個鍵中。非常感激啓發。 – twobob 2016-02-24 23:50:45