如果本地存储中不存在localscores,我有以下用于创建虚拟高分表:
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);
在我重新加载游戏并运行第一个函数之前,一切都很好,它似乎为highscores数组添加了空值。所以,如果我添加5个额外的分数,我将在数组中有3个空值?
[Object,Object,Object,Object,Object,Object,Object,Object,Object,Object,null,null,null,null,null]
这让我相信,如果localscores存在,我评估的行是错误的 (localStorage.getItem(“localScores”)=== null)
或者删除数组中第11个元素的地方是错误的 删除高分[10];
或者还有其他一些我看不到的问题,如果有人知道发生了什么,我会非常感谢你的帮助。
答案 0 :(得分:4)
当您在Array实例上调用delete
时,实际上并没有缩短数组,只需用undefined
替换指定索引处的值。
如果highscores
的长度始终不超过10,并且要删除的项目始终是最后一项,则只需使用highscores.length = 10
。
您也可以使用highscores = highscores.slice(0,10);
,但正如jfriend00指出的那样,它确实涉及创建新数组的额外开销。
尽管如此,我觉得有必要提一下,与浏览器编码/解码JSON和从localStorage读/写所做的工作量相比,创建新阵列的性能真的只是一滴水,这是出了名的慢。
答案 1 :(得分:3)
您可以使用高分。pop()代替delete highscores[10];