2017-07-11 12 views
1

ループのアイテムを 'storedCompletion'配列の先頭に追加しようとしていますが、何らかの理由でループを繰り返してブラウザがクラッシュするだけです。不連続連続ループですか?

私は配列の各オブジェクトをループした後、オブジェクトIDがリスト項目の要素IDと一致するかどうかをチェックして、一度に実行する必要があるのはなぜですか?

JS

if(localStorage) { 
    var storedCompletion = JSON.parse(localStorage.getItem('todos')); 
    } 

    for(var f=0; f<storedCompletion.length; f++) { 
    if(storedCompletion[f].id == listItem.id) { 
     storedCompletion[f].completed = false; 
     console.log(storedCompletion); 
     storedCompletion.unshift(storedCompletion[f]); 
     console.log(storedCompletion); 
    } 
    } 
    localStorage.setItem('todos', JSON.stringify(storedCompletion)); 
+0

サンプルデータを表示せずに言うのは難しいですが、unshiftは反復する配列に値を追加します。あなたは何をしたいのですか? – terpinmd

答えて

2

あなたはf < storedCompletion.lengthながらループしているが、あなたはあなたのforループの内部でその長さを増加しています。

あなたはunshift()ですので、アイテムは最初に移動します。それはすべてが1つ上にプッシュすることを意味します。したがって、f++が発生すると、同じアイテムが表示されます。したがって、それは永遠に追加し続けるでしょう。それによって

ステップ数回:永遠に

s = [0]; // s.length === 1, f < s.length 
f = 0; 
// unshift s, f++ 
s = [1,0]; // s.length === 2, f < s.length 
f = 1; // still points at 0 
// unshift s, f++ 
s = [2,1,0]; // s.length === 3, f < s.length 
f = 2; // still points at 0 

そしてそう。あなたは無限ループに陥っています。

正確に何をしようとしているのかわかりませんが、新しい項目を追加する新しい配列を作成してstoredCompletionのままにしてから、新しい配列をstoredCompletionに設定します。

+0

ありがとうございました私はまた、私はそれがちょうどシフトだと思うので、私はそれが最初のものを削除したと思った他の項目をシフトunshiftを実現していませんでした。 –

+0

'unshift()'/'shift()'は 'push()/ pop()'と等価です。アイテムを削除するには、 'splice(indexOfItemToRemove、1)'を使います。 – samanime