保持在同一函数中使用clear()时迭代的localStorage对象

时间:2016-11-13 14:19:31

标签: javascript json local-storage

当用户完成游戏循环或开始新游戏时,我试图清除所有本地存储空间,但也保留一些值。

我已经可以用我的音量值来做到这一点:

// inside a conditional statement that fires when the user chooses to start a new game.
if (newGameBool === '1') {
    var tst = myAu;
//myAu is the stored value that the user sets as sound using a range type input

    localStorage.clear();

    localStorage.setItem("Au", tst);//A newly cleared localStorage just got a new value, and it's the same as it was before. 

    UI.myLoad();//reload the function that uses LS to do things. 

}

如何为附加了迭代编号的密钥执行此操作?

以下是我如何保存它们:

var i = +v + +1; 

localStorage.setItem("v", i);

var vv = localStorage.getItem("v");

localStorage.setItem("LdrBrd_" + vv, JSON.stringify(LdrBrd));//saves all data with the iterating key name.

按照声音功能的方式调用它们:

var gv = v + 1;//v calls the value from LS and adjusted for off-by-one error.  gv is a local variable.
if (newGameBool === '1') {
    var ldd, vg;

    for (var ii = 0; ii < gv; ii++) {
        var ld = localStorage.getItem("LdrBrd_" + ii);
        if (ld != null) {
        //these are the values that i want to pass beyond the clear point
            ldd = JSON.parse(ld);//JSON string of data saved
            vg = ii;//how many of them.
        }

    }

    localStorage.clear();

    for (var xx = 0; xx < vg; xx++) {
        var nld = localStorage.getItem("LdrBrd_" + xx);
        if (nld != null) {
           localStorage.setItem("LdrBrd_" + ii, JSON.stringify(ldd));
        }
    }
    localStorage.setItem("v", vg);

    UI.myLoad();

}

我一直在各个地方使用console.log()来查看发生了什么。我评论清除功能只是为了看看价值是否错误而且他们并没有全部保存。我试图做一个小提琴,但当地的存储并没有在那里工作。在visual studio中,它工作正常但是这个文件的脚本差不多有2000行,所以我试着把它装扮成我知道的最好的。

提前感谢您的任何帮助或指导。

2 个答案:

答案 0 :(得分:0)

我被困在这几天,但我想我找到了一些可行的东西,所以我会回答我自己的问题,以防后代有价值。

locatStorage.clear();
/*  ^LS clear() function is above all new setItem codes, some variables are declared globally and some are declared at the top of the functional scope or as param^  */
var itemClass = document.querySelectorAll(".itemClass");//the strings are here

if (itemClass) {//make sure some exist
    for (var p = 0; p < itemClass.length; p++) {//count them
        mdd = JSON.parse(itemClass[p].innerText);//parse the data for saving

        localStorage.setItem("v", v);//this is the LS item that saves the amount of items i have, it's declared at the top of the functions timeline.
        localStorage.setItem("LdrBrd_" + p, JSON.stringify(mdd));//this setItem function will repeat and increment with 'p' and assign the right string back to the key name it had before.
    }
}

关键是保持字符串物理连接到元素,然后调用类名。我跑了一个循环来计算它们。 'mdd'将吐出我想要的每件物品。那么剩下要做的就是将项目重新设置回原始状态。

这使我能够为我的用户创建一种收集奖杯的方式,并在他/她决定开始新游戏时清除localStorage后保留这些奖杯。

我使用CSS隐藏字符串中的文本。

color:transparent;

在我的gameLoop中,我有一个函数可以读取保存的字符串,并将它们显示为隐藏字符串正下方的卡片。

enter image description here

答案 1 :(得分:0)

由于您想保留一些值,我建议使用以下两种方法之一:

  1. 请勿拨打localStorage.clear(),而只使用localStorage.removeItem('itemName')清除所需的值。由于您说项目名称具有数字组件,因此您可以在循环中执行此操作以减少代码。

  2. 拉出要先保存的项目,并在调用clear()后恢复它们。如果有更多项目需要删除而不是保存(见下文)

  3. ,则此选项最佳

    function mostlyClear() {
        var saveMe = {};
        saveMe['value1'] = localStorage.getItem('value1');
        saveMe['anotherValue'] = localStorage.getItem('anotherValue');
        localStorage.clear();
        for(var prop in saveMe) {
            if(!saveMe.hasOwnProperty(prop)) continue;
    
            localStorage.setItem(prop, saveMe[prop]);
        }
    }