我是loopy还是localstorage ......?

时间:2012-12-28 03:59:40

标签: javascript for-loop local-storage

我的目标:通过使用for循环移除以前使用过的项目来清理localstorage。

通常,我有很多项目,如下:

order-1356666288243 => {"cartID":2713329701836,"productName"...
order-1356666288243 => {"cartID":2713329701836,"productName"...

当我检查完全有多少项时,我得到正确的零基数:

console.log( localStorage.length );

即使我做了for loop来写出关键字和值,还有console.log()其他一些东西,一切都很好:

for(var i=0, len=localStorage.length; i<=len; i++) {

    var key = localStorage.key(i);
    var value = localStorage[key];
    console.log(key + " => " + value);


        if(key != '' && key != null){

            console.log( key.indexOf('order-') );
            console.log(i + '. Key: ', key);

            if(key.indexOf('order-') != -1){
                console.log('The key to be removed is: ', key.toString());
                localStorage.removeItem(key.toString());
            }
       }

    console.log(i + ': ' + len);
}

一切都可以满足人们的期望。但是,当我运行脚本时,此行仅执行

localStorage.removeItem(key);

localStorage.removeItem(key.toString());

事实上,我必须多次运行整个脚本。所以,如果我有,说3项,我需要运行循环3次以摆脱每个项目。

我很困惑:我哪里出错了?所有console.log()内容都显示3次(如果我有3个项目并运行for loop一次)。出于绝望,我甚至将i < len更改为i >= len,但这也无法解决问题。

任何?

3 个答案:

答案 0 :(得分:2)

我认为问题是当您删除项目时,它会更改本地存储的长度。尝试从长度-1向下迭代到0而不是从0到长度。 (顺便说一下,循环条件应该是i < len,而不是i <= len。我的建议当然应该是i >= 0。)

答案 1 :(得分:2)

问题是您在遍历集合时正在修改集合。这样做时要小心。

在这种特殊情况下,删除项目时localStorage的长度会发生变化,因此您最终会跳过项目。

您应该向后遍历localStorage (最后一项到第一项),或者更好的是你应该在两次传递中执行此操作:一次传递以收集要删除的键,另一次传递传递删除它们:

Object.keys(localStorage)
.filter(function(key){return key.indexOf('order-')===0})
.forEach(localStorage.removeItem, localStorage);

或者,如果您需要在IE8或FF3.x中使用它:

var delkeys = [], key, i, len;
for (i=0,len=localStorage.length; i<len, key=localStorage.key(i); i++) {
    if (key.indexOf('order-')===0) {
        delkeys.push(key);
    }
}
for (i=0,len=delkeys.length; i<len, key=delkeys[i], i++) {
    localStorage.removeItem(key);
}

答案 2 :(得分:1)

循环应倒计时以防止删除密钥的问题改变存储长度。试试这个循环代替:

for( var i = localStorage.length; i--;){
//make sure to remove references to len in your code
}