Javascript 我是loopy还是localstorage。。。?

Javascript 我是loopy还是localstorage。。。?,javascript,for-loop,local-storage,Javascript,For Loop,Local Storage,我的目标是:通过使用for循环删除以前使用过的项来清理本地存储 通常,我有很多项目,比如: order-1356666288243 => {"cartID":2713329701836,"productName"... order-1356666288243 => {"cartID":2713329701836,"productName"... 当我检查总共有多少项时,我得到了正确的零基金额: console.log( localStorage.length ); 即使我执行fo

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

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

order-1356666288243 => {"cartID":2713329701836,"productName"...
order-1356666288243 => {"cartID":2713329701836,"productName"...
当我检查总共有多少项时,我得到了正确的零基金额:

console.log( localStorage.length );
即使我执行
for循环
来写出键和值,以及
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);
}

事实上,我必须尽可能多次地运行整个脚本。因此,如果我有,比如说3个项目,我需要运行循环3次来去除每个项目

我很困惑:我哪里做错了?所有
console.log()
东西都会显示3次(如果我有3个项目并运行
for循环一次)。出于绝望,我甚至将
I
改为
I>=len
,但这也不能解决问题


有人吗?

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

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

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

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

循环应该倒计时,以防止被删除的密钥改变存储长度的问题。请尝试以下for循环:

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

问题是在遍历集合时正在修改集合。做这件事的时候一定要小心

在这种特殊情况下,删除项目时,
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);
}
var delkeys=[],key,i,len;

对于(i=0,len=localStorage.length;i而言,问题在于您在遍历集合时正在修改它。执行此操作时务必小心

在这种特殊情况下,删除项目时,
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);
}
var delkeys=[],key,i,len;

对于(i=0,len=localStorage.length;iI应该详细说明:当您删除一个项时,其余的项向下移动,因此每当您删除一个项时,您都会跳过下一个项。因此,除了向后迭代之外,还有一种替代方法,就是每次决定在键
i
处删除该项时,都执行
。这样,循环的下一次迭代可以tch您刚刚清空的插槽中的钥匙所在的项目。谢谢@Ted Hoop。经过一段时间的磨蹭,我为循环
找到了以下替代品:var I=localStorage.length;while(I--){我应该详细说明一下:当您删除一个项目时,其余的项目会向下移动,因此每当您删除一个项目时,您都会跳过下一个项目。因此,向后迭代的另一种替代方法是每次您决定在键
I
处删除该项目时,都执行
。这样,循环的下一次迭代将捕获其键移动了I的项目到您刚刚清空的插槽。谢谢@Ted Hoop。经过一段时间的磨蹭,我想出了以下方法来替换
for循环
:var I=localStorage.length;while(I--){听起来很有趣。谢谢。我会尝试一下。非常感谢。PS:太棒了!我需要开始研究这种方法,并开始更频繁地使用它。谢谢你展示给我。听起来很有趣。谢谢。我会尝试一下。非常感谢。PS:太棒了ing!我需要开始研究这种方法,并开始更频繁地使用它。谢谢你向我展示。谢谢你的帮助。我当时是这样的,但可能我做错了,因为我没有用那种方法,但我会再测试一次,只是为了确保。谢谢。(PS:刚刚测试过,很有效。谢谢。)谢谢你的帮助。我当时就在那一点上,但也许我做错了,因为我在这种方法上没有运气,但我会再测试一次,只是为了确保。谢谢。(PS:刚刚测试过,这很有效。谢谢。)