0

私の目標: ループで以前に使用されたアイテムを削除することにより、localstorage をクリーンアップしforます。

通常、次のようにいくつかのアイテムがあります。

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

全体でいくつのアイテムがあるかを確認すると、正しいゼロベースの金額が得られます。

console.log( localStorage.length );

for loopキーと値、およびその他のいくつかを書き出すためにa を実行して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);
}

すべてがほとんど期待どおりに機能します。ただし、この行は、スクリプトを実行したときに 1回だけ実行されます。

localStorage.removeItem(key);

また

localStorage.removeItem(key.toString());

実際、アイテムの数だけスクリプト全体を実行する必要があります。したがって、たとえば 3 つのアイテムがある場合、ループを 3 回実行して各アイテムを削除する必要があります。

私は困惑しています: どこで間違ったのですか? すべてのconsole.log()ものは3回表示されます(3つのアイテムがあり、for loop1回実行した場合)。絶望から に変更i < lenしましたがi >= len、それでも問題は解決しません。

誰?

4

3 に答える 3

2

問題は、アイテムを削除すると、ローカルストレージの長さが変わることだと思います。0 から長さまでではなく、長さ 1 から 0 まで繰り返してみてください。(ちなみに、ループ条件はi < lenではなくである必要があります。i <= lenもちろん、私の提案では、 である必要がありますi >= 0。)

于 2012-12-28T04:04:19.067 に答える
2

問題は、コレクションをトラバースしている間にコレクションを変更していることです。これを行うときは常に注意してください。

この特定のケースではlocalStorage、アイテムを削除すると長さが変わるため、アイテムをスキップすることになります。

localStorage 逆方向(最後のアイテムから最初のアイテムへ) にトラバースするか、2 つのパスでこれを行う必要があります。1 つのパスで削除するキーを収集し、別のパスでそれらを削除します。

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 に答える