我的目标:通过使用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
,但这也无法解决问题。
任何?
答案 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
}