В ситуациях, когда вам нужно рекурсивно проходить вложенные структуры данных и выполнять операцию для каждого элемента, вы можете использовать комбинация рекурсии и forEach. Однако могут быть случаи, когда вам потребуется преждевременно выйти из цикла forEach.
В отличие от обычного цикла с операторами прерывания или продолжения, в 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. Фактически это действует как оператор прерывания.
comment.comments.every(function (elem) {
recurs(elem);
if (...) return false;
return true;
});
Вы также можете использовать some() вместо Every(), если предпочитаете возвращать true для прерывания.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3