6

Как выйти из вложенных циклов в JavaScript?

1

Описание проблемы: Как выйти из вложенных циклов в JavaScript?

У меня есть следующий код, который проходит через несколько вложенных циклов, и мне нужно выйти не только из одного, но и из двух вложенных циклов при выполнении определенного условия.

Вот код:

// Записываем ссылки на страницу.
for (var x = 0; x < Args.length; x++) {
   for (var Heading in Navigation.Headings) {
      for (var Item in Navigation.Headings[Heading]) {
         if (Args[x] == Navigation.Headings[Heading][Item].Name) {
            document.write("<a href=\"" 
               + Navigation.Headings[Heading][Item].URL + "\">" 
               + Navigation.Headings[Heading][Item].Name + "</a> : ");
            break; // <--- ЗДЕСЬ мне нужно выйти из двух циклов.
         }
      }
   }
}

В текущей версии кода, команда break; позволяет покинуть только самый внутренний цикл. Как мне сделать так, чтобы при выполнении значения Args[x] равного Navigation.Headings[Heading][Item].Name, я мог выйти из обоих циклов? Спасибо!

5 ответ(ов)

2

Оберните это в функцию, а затем просто return.

1

Я немного запоздал с ответом, но вот язык-агностический подход, который не использует GOTO/метки или обертки функций:

for (var x = Set1.length; x > 0; x--) {
   for (var y = Set2.length; y > 0; y--) {
      for (var z = Set3.length; z > 0; z--) {
          z = y = -1; // завершает второй цикл
          // z = y = x = -1; // завершает первый цикл
      }
   }
}

С одной стороны, этот код выглядит естественно, что должно понравиться сторонникам отказа от GOTO. С другой стороны, внутренний цикл должен завершить текущую итерацию перед остановкой, так что может оказаться, что данный подход не подходит для некоторых сценариев.

0

Я понимаю, что это довольно старая тема, но поскольку моего стандартного подхода здесь еще нет, решил поделиться своим решением для будущих гуглеров.

var a, b, abort = false;
for (a = 0; a < 10 && !abort; a++) {
    for (b = 0; b < 10 && !abort; b++) {
        if (condition) {
            doSomeThing();
            abort = true;
        }
    }
}

Этот фрагмент кода представляет собой вложенные циклы, которые выполняются до тех пор, пока не будет достигнуто условие прерывания (в данном случае – abort). Если условие истинно, вызывается функция doSomeThing(), и устанавливается флаг abort в true, что прерывает оба цикла.

Такой подход позволяет контролировать выполнение внутреннего цикла с помощью внешнего условия, что может быть полезно, если вам необходимо прервать оба цикла по определенному условию.

Если нужно оптимизировать код, можно рассмотреть другие конструкции, такие как break или использование функций, но в этом ценном случае, данный способ демонстрирует хороший уровень контроля.

0

Вы можете упростить ваш код, так как в текущем варианте происходит ненужный вложенный цикл с использованием for...in, который предназначен для перебора свойств объектов, а не массивов. Вместо этого лучше использовать обычный for или forEach. Вот исправленный пример кода:

var a = [1, 2, 3];
var b = [4, 5, 6];

// Используем обычный цикл for для перебора массива a
for (var i = 0; i < a.length; i++) {
    // Здесь вы можете добавить логику с массивом b, если это нужно
    break; // break для выхода из цикла после первой итерации
}

Если ваша цель — просто выйти из цикла после первой итерации, то достаточно не использовать вложенный цикл. Тем не менее, если нужно делать что-то с массивом b, вы можете сделать это внутри первого цикла. Но если у вас нет конкретной логики по обработке массива b, то вышеприведенный код достаточно прост и эффективен.

0

Вот пять способов прервать выполнение вложенных циклов в JavaScript:

1) Установить значение родительского цикла на конец

for (i = 0; i < 5; i++) {
    for (j = 0; j < 5; j++) {
        if (j === 2) {
            i = 5; // Выход за пределы цикла
            break;
        }
    }
}

2) Использовать метку

exit_loops: 
for (i = 0; i < 5; i++) {
    for (j = 0; j < 5; j++) {
        if (j === 2) 
            break exit_loops; // Выход из обоих циклов
    }
}

3) Использовать переменную

var exit_loops = false;
for (i = 0; i < 5; i++) {
    for (j = 0; j < 5; j++) {
        if (j === 2) {
            exit_loops = true; // Установить флаг
            break;
        }
    }
    if (exit_loops)
        break; // Проверка флага и выход
}

4) Использовать самовызывающуюся функцию

(function() {
    for (i = 0; i < 5; i++) {
        for (j = 0; j < 5; j++) {
            if (j === 2)
                return; // Выход из функции
        }
    }
})();

5) Использовать обычную функцию

function nested_loops() {
    for (i = 0; i < 5; i++) {
        for (j = 0; j < 5; j++) {
            if (j === 2)
                return; // Выход из функции
        }
    }
}
nested_loops(); // Вызов функции

Эти методы позволяют эффективно прерывать выполнение вложенных циклов в зависимости от ваших потребностей.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь