開発プロセスのJavaScriptアプリケーションは、多くの場合、サイクルのニーズに指定された要素を削除遭遇します。
従来の考え方によると、アレイは、内部ループ、あなたは判決で指定された要素を削除できるかどうかを決定、その後、forループであるということです。
しかし、現実には、多くの場合のようにスムーズに期待通りに実行されません。
削減シナリオの問題
(関数(){ VARの ARR = [1、2、2 ,. 3 ,. 4 ,. 5。;] のための(VAR Iはarr.lengthを<; I = 0 Iは++ ){ // プリントファクトアレイは、アレイの追跡を容易データは変更 はconsole.log(I + '=' + ARR [I]); //は要素2の全削除を IF(ARR [I] === 2 ){ arr.splice(I、 1 ); } } にconsole.log(ARR); })();
整合条件の他の要素がまだ存在しているときは、最終的な結果から見ることができ、このコードは実際にはもともと設計されたプログラムを満たしていない、試合のうちの要素を1つだけ削除します。
プロセスは、印刷から実行され、この結果の原因を見つけることは困難ではないときに要素を削除するためである、要素(添字)の配列インデックスは、プログラムの異常が生じ、リアルタイムに変化を生じました。
問題の解決策
問題の原因を見つけ、問題を解決することは難しいことではありません。
方法1:リアルタイム関係を対応する調整指標配列要素。
(関数(){ VARの ARR = [1、2、2 ,. 3 ,. 4 ,. 5。;] のための(VAR Iはarr.lengthを<; I = 0 Iは++ ){ // プリントファクトアレイは、アレイの追跡を容易データは変更 はconsole.log(I + '=' + ARR [I]); //は要素2の全削除を IF(ARR [I] === 2 ){ arr.splice(I - ,. 1 ) ; } } にconsole.log(ARR); })();
要素(添字)の背後にある要素のインデックスは、順方向プラス一つである中央から要素を除去した後、ので、我々は、手動で要素を除去した後、サイクルインデックスをリセットすることができ、ために発生します今、対応するインデックスとして(i--)。
方法2:配列要素を通って背面から。
(関数(){ VARの ARR = [1、2、2 ,. 3 ,. 4 ,. 5。;] のために(varは。I = arr.length - 1; I> = 0; i-- ){ // プリントアレイ、アレイ内のトラッキングデータを容易にするために変更 はconsole.logを(I + '=' + ARR [I]); //は要素2の全削除 IF(ARR [I]は=== 2 ){ arr.splice(Iを、 1 ); } } にconsole.log(ARR); })();
真ん中のうちの要素を削除した後に、要素(添字)の背後にある要素のインデックスは限りバックから前方ループは、あなたが背後にある要素を制御することができないとして、その後、前方に1を加えているので、ために発生しますインデックス(添字)A。
方法3:代わりに、whileループのループのために使用し(ループ又は後方から前方)。
(関数(){ VAR ARR = [1、2、2、3、4、5 ]; VAR I = arr.length; 一方(i-- ){ にconsole.log(I + '=' + ARR [I] ); もし(ARR [I] === 2 ){ arr.splice(I、 1 ); } } にconsole.log(ARR); })();
バックループから上記原理と一致する、whileループだけではなく、forループを使用。
「今日は明日の昨日で、昨日は新しい日です。」