2012-03-31 51 views
0

我有以下用於創建一個虛擬的高評分表,如果,如果localscores在本地存儲中不存在:JavaScript的本地存儲找出是否存在

if (localStorage.getItem("localScores") === null) { 

highscores = [ 
    {user: "Player 1", score: 100}, 
    {user: "Player 2", score: 90}, 
    {user: "Player 3", score: 80}, 
    {user: "Player 4", score: 70}, 
    {user: "Player 5", score: 60}, 
    {user: "Player 6", score: 50}, 
    {user: "Player 7", score: 40}, 
    {user: "Player 8", score: 30}, 
    {user: "Player 9", score: 20}, 
    {user: "Player 10", score: 10} 
    ]; 
    localStorage['localScores']=JSON.stringify(highscores); 
    console.log("doesn't exist") 
} 

else{ 
highscores = JSON.parse(localStorage['localScores']); 
console.log("exists") 
} 

我總是想保持10分,所以我有這個加分,其中的用戶名和總的名義進入和得分達到:

highscores.push({user: username, score: total});        
highscores.sort(function(a,b){ return b.score - a.score});  
delete highscores[10]; 
localStorage['localScores']=JSON.stringify(highscores); 
console.log(highscores); 

一切都很好,直到我重新加載遊戲和第一功能運行時,它似乎爲空值添加到高分陣列。所以如果我添加5個額外的分數,我會在數組中有3個空值?

[對象,對象,對象,對象,對象,對象,對象,對象,對象,對象,NULL,NULL,NULL,NULL,NULL]

這使我相信,無論是在哪裏評估線如果存在localscores是錯誤 (localStorage.getItem(「localScores」)===空)

或者其中I在陣列中刪除第11元件是錯誤 刪除高分[10];

或者還有其他一些問題,我沒有看到,如果有人知道發生了什麼我非常感謝一些幫助。

回答

4

當您在Array實例上調用delete時,實際上不會縮短陣列的長度,只需將指定索引處的值替換爲undefined即可。

如果highscores的長度應該始終不大於10,並且要移除的項目將始終是最後一項,那麼您可以簡單地使用highscores.length = 10

您也可以使用highscores = highscores.slice(0,10);,但正如jfriend00指出的那樣,它確實涉及創建新陣列的額外開銷。

儘管我不得不提到創建一個新數組的性能命中率實際上只是一個下降,但與瀏覽器對JSON進行編碼/解碼和從localStorage讀取/寫入的工作量,這是非常緩慢的。

+0

好像是這樣,謝謝 – mao 2012-03-31 00:33:27

+0

這也適用於修剪'highscores':'if(highscores.length> 10){highscores.length = 10;}',這不會產生像.slice()這樣的數組副本。 – jfriend00 2012-03-31 00:39:36

3

您可以使用高分。 pop()而不是delete highscores[10];

相關問題