入れ子になったデータ構造を再帰的に走査し、要素ごとに操作を実行する必要がある状況では、再帰と forEach の組み合わせ。ただし、forEach ループを途中で終了する必要がある場合があります。
break ステートメントまたは continue ステートメントを含む通常のループとは異なり、forEach には反復を停止する組み込みメカニズムがありません。この動作をシミュレートするために、
1 の 3 つのアプローチを検討してみましょう。 「醜い」方法: コンテキストのブール値を使用する
2 番目の引数をコンテキストとして forEach に渡し、そこにブール値を格納します。コールバック関数内でブール値を確認し、必要に応じてブレイクアウトします。このアプローチは見た目に魅力的ではありません。
function recurs(comment) {
var stop = false;
comment.comments.forEach(function (elem) {
recurs(elem);
if (...) stop = true;
}, stop);
}
2. 「物議を醸す」方法: 例外処理
forEach ループを try-catch ブロック内で囲みます。ブレークしたい場合は、例外をスローしてループの外でキャッチします。このアプローチはパフォーマンスに影響を与える可能性があり、コードの可読性に関する懸念を引き起こす可能性があります。
try {
comment.comments.forEach(function (elem) {
recurs(elem);
if (...) throw new Error("Stop Iteration");
});
} catch (e) {
if (e.message === "Stop Iteration") return;
}
3. 「楽しい」方法: Every()
every() を使用する方が良い選択肢です。コールバック関数が false を返すまで、コレクションの反復処理を続けます。これは事実上、break ステートメントとして機能します。
comment.comments.every(function (elem) {
recurs(elem);
if (...) return false;
return true;
});
ブレークするために true を返したい場合は、every() の代わりに some() を使用することもできます。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3