在需要遞歸遍歷嵌套資料結構並對每個元素執行操作的情況下,您可以使用遞歸和forEach的組合。但是,在某些情況下,您可能需要提前退出 forEach 迴圈。
與 break 或 continue 語句的常規迴圈不同,forEach 缺乏停止迭代的內建機制。為了模擬這個行為,讓我們來探索三種方法:
1。 「醜陋」的方式:使用上下文布林值
將第二個參數傳遞給 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 來中斷,也可以使用 some() 來取代 every()。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3