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:刚刚测试过,这很有效。谢谢。)