0

我的目标:通过循环删除以前使用的项目来清理本地存储for

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

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 < leni >= len,但这也不能解决问题。

任何人?

4

3 回答 3

2

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

于 2012-12-28T04:04:19.067 回答
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);
}
于 2012-12-28T04:29:51.673 回答
1

循环应该倒计时以防止删除键改变存储长度的问题。试试这个 for 循环:

for( var i = localStorage.length; i--;){
//make sure to remove references to len in your code
}
于 2012-12-28T04:18:33.957 回答