最も一般的に使用されるトラバーサル方法は、ステートメント用です(また再帰的であり、その間)。配列を横断するとき、通常はこれを行います。
コードコピーは次のとおりです。
var arr = [1,2,3,4,5,6,7,8,9,10];
for(var i = 0、total = arr.length; i <total; i ++){
console.log(i、arr [i]);
}
これは、最も一般的に使用されるトラバーサル方法:正の順序トラバーサルです。アレイの最初のアイテムから最後のアイテムに移動します。
それでは、なぜ小さなドラマはまだ今日も逆のオーダートラバーサルに言及しているのでしょうか?
ここでは、Xiaoju:Eventsによって書かれたコンポーネントで最も一般的に使用されるモジュールについて言及する必要があります。カスタムイベントモデルの作成、イベントのリスニングとトリガー、最もシンプルなパブリッシュモードとサブスクライブモードを作成するために使用されます。メモリオーバーフローの隠された危険があることを最近発見したため、元のベースでバインドする方法を追加する必要があります。
同じイベント名を持つコールバック関数は同じ配列に配置されているため、バインディングを解除するには、配列から対応するコールバック関数を見つける必要があります(同じコールバック関数は複数回バインドされる場合があります)。
これは非常に単純な要件なので、自然に次のようなコードを書きました。
コードコピーは次のとおりです。
//配列で2を削除します
var arr = [1,2,2,2,2,1,1,2,2];
for(var i = 0、total = arr.length; i <total; i ++){
if(arr [i] == 2){
//条件を満たし、削除します
arr.splice(i、1);
}
}
console.log(arr);
通常のコードはありませんが、最終出力は次のとおりです。[1、2、2、1、1、2]。明らかに、実行結果は期待を満たしていません。
何が問題なのですか?
慎重な分析の後、問題は、試合が成功するたびに、削除操作を実行した後、アレイ内の各アイテムが1つずつ上昇するため、チェックされる次のアイテムがスキップされることがわかりました。
問題を見つけ、コードを変更し、削除操作を実行した後、シーケンスインデックス(I)を調整します。
コードコピーは次のとおりです。
//配列で2を削除します
var arr = [1,2,2,2,2,1,1,2,2];
for(var i = 0、total = arr.length; i <total; i ++){
if(arr [i] == 2){
//条件を満たし、削除します
arr.splice(i、1);
//シーケンスインデックスを調整します
i = i-1;
}
}
console.log(arr);
問題は解決されましたが、シーケンスインデックスを変更することはループを作成するためのトリックであると常に感じています。そのため、インスピレーションの閃光と平手打ち、そして次のコードが打ち切られました。
コードコピーは次のとおりです。
//配列で2を削除します
var arr = [1,2,2,2,2,1,1,2,2];
for(var i = arr.length-1; i!= -1; i-){
if(arr [i] == 2){
//条件を満たし、削除します
arr.splice(i、1);
}
}
console.log(arr);
トラバーサルプロセスは変更されていません。変化する唯一のことは、トラバーサルの順序が変更されたことです。ちなみに、1つの変数の合計が欠落しています。
OK、私が今日書いたものは非常に絹のようなものであることを認めますが、この例を通して、将来コードを書くときに思い出させます。トラバーサルプロセス中に、配列自体の変更(追加および削除)を伴う場合、逆トラバーサルは比較的安全なトラバーサル方法です。
メモをコーディングして、将来自分をock笑するようにしてください!
転載のソースを示してください:http://bh-lay.com/blog/148c07761fa