Цикл в цикле и метки

Пример цикла в цикле:

Код
for (let i = 0; i < 3; i++) {
  console.log(`Основной цикл, i равно ${i}`);
  for (let j = 0; j < 3; j++) {
  console.log(`j равно ${j}`);
  }
}

Цитата
Основной цикл, i равно 0
j равно 0
j равно 1
j равно 2
Основной цикл, i равно 1
j равно 0
j равно 1
j равно 2
Основной цикл, i равно 2
j равно 0
j равно 1
j равно 2

Создание с помощью вложенного цикла фигуры треугольник

Цитата
*
**
***
****
*****
******

Основной цикл отвечает за создание рядов фигуры, а вложенный - за наполнение рядов звёздочками.

Отталкиваться будем от пустой строки, которая будет затем заполняться и выводиться в консоль.

Код
let result = '';

Ограничение на количество рядов задаем в отдельной переменной:

Код
const length = 7;

Собственно весь код решения:

Код
let result = "";
const length = 7;

for (let i = 1; i < length; i++) {
  for (let j = 0; j < i; j++) {
  result += "*";
  }
  result += "\n";
}

console.log(result);

Как это работает:

Запускается основной цикл

i = 1

Запускается встроенный цикл

j = 0

в строку добавляется одна звёздочка

добавляется перенос строки

Продолжается основной цикл

i = 2

Запускается встроенный цикл

j = 0

в строку добавляется одна звёздочка

j = 1

в строку добавляется ещё одна звёздочка

добавляется перенос строки

И так далее.

Как быть, если из вложенного цикла нужно сразу перейти к следующей итерации основного цикла?

Возьмём цикл с двумя уровнями вложенности:

Код
for (let i = 0; i < 3; i++) {
  console.log(`First level: ${i}`);

  for (let j = 0; j < 3; j++) {
  console.log(`Second level: ${j}`);

  for (let k = 0; k < 3; k++) {
  console.log(`Third level: ${k}`);
  }
  }
}

Добавим условие, что если k = 2, то мы начнём основной цикл с новой итерации, то есть завершим два внутренних и перейдём сразу к следующей итерации основного.

Для этого нужна метка - чёткое указание где останавливать или продолжать цикл.

Код
first: for (let i = 0; i < 3; i++) {
  console.log(`First level: ${i}`);

  for (let j = 0; j < 3; j++) {
  console.log(`Second level: ${j}`);

  for (let k = 0; k < 3; k++) {
  if (k === 2) continue first;
  console.log(`Third level: ${k}`);
  }
  }
}

В данном случае, first - это и есть метка, а в условии мы ссылаемся на неё, показывая, что если условие верно, запустить основной цикл.

Цитата
First level: 0
Second level: 0
Third level: 0
Third level: 1
First level: 1
Second level: 0
Third level: 0
Third level: 1
First level: 2
Second level: 0
Third level: 0
Third level: 1

Если вместо continue использовать break, то как только k примет значение 2, сработает break и благодаря метке весь основной цикл полностью остановится.

Документация по меткам

Всего комментариев: 0

Имя *:
Email *:
Код *:
Хостинг от uCoz