Repetition Statements в TypeScript
Эта статья объясняет операторы повторения в TypeScript.
YouTube Video
Оператор for
в TypeScript
Оператор for
в TypeScript – это базовая структура цикла для выполнения повторяющихся операций. В цикле for
один и тот же блок кода может выполняться многократно на основе заданного количества повторений или условий.
Базовый синтаксис
1for (initialization; condition; update) {
2 // Code to execute repeatedly while the condition is true
3}
- ** инициализация**: Это часть, которая выполняется только один раз перед началом цикла. Инициализировать переменные, такие как счетчики циклов.
- Условия («условия»): Определить, продолжается ли цикл. Если верно, продолжайте цикл, а если ложно, выход.
- ** Обновление (обновление)**: Запустите в конце каждого цикла и обновите счетчик цикла.
Пример 1: Базовый цикл for
В примере ниже выводятся числа от 0
до 4
по порядку.
1for (let i = 0; i < 5; i++) {
2 console.log("The value of i is: " + i);
3}
4// Outputs:
5// The value of i is: 0
6// The value of i is: 1
7// The value of i is: 2
8// The value of i is: 3
9// The value of i is: 4
Пример 2: цикл for
с массивом
Вы также можете использовать цикл for
для обработки элементов массива по порядку.
1let fruits: string[] = ["apple", "banana", "cherry"];
2
3for (let i = 0; i < fruits.length; i++) {
4 console.log("Fruit: " + fruits[i]);
5}
6// Outputs:
7// Fruit: apple
8// Fruit: banana
9// Fruit: cherry
Пример 3: цикл for-in
Цикл for-in
используется для перебора свойств объекта или индексов массива по порядку.
1let car = { brand: "Toyota", model: "Corolla", year: 2020 };
2
3for (let key in car) {
4 console.log(key + ": " + car[key]);
5}
6// Outputs:
7// brand: Toyota
8// model: Corolla
9// year: 2020
Пример 4: цикл for-of
Цикл for-of
используется для получения значений каждого элемента по порядку из итерируемых объектов, таких как массивы или строки.
1let colors: string[] = ["red", "green", "blue"];
2
3for (let color of colors) {
4 console.log("Color: " + color);
5}
6// Outputs:
7// Color: red
8// Color: green
9// Color: blue
Пример 5: Вложенный цикл for
Также возможно использовать цикл for
внутри другого цикла for
, что называется вложенным циклом. Это позволяет, среди прочего, создавать двойные циклы.
1for (let i = 0; i < 3; i++) {
2 console.log("Outer loop i: " + i);
3 for (let j = 0; j < 2; j++) {
4 console.log(" Inner loop j: " + j);
5 }
6}
7// Outputs:
8// Outer loop i: 0
9// Inner loop j: 0
10// Inner loop j: 1
11// Outer loop i: 1
12// Inner loop j: 0
13// Inner loop j: 1
14// Outer loop i: 2
15// Inner loop j: 0
16// Inner loop j: 1
Резюме
- Оператор
for
выполняет повторяющуюся обработку на основе заданных количеств или условий. for-in
используется для получения свойств объекта или индексов массива.for-of
получает значения элементов из итерируемых объектов, таких как массивы.- Сложная повторяющаяся обработка также возможна с вложенными циклами
for
.
Оператор for
в TypeScript предоставляет мощную и гибкую обработку повторений, аналогичную другим циклам.
Оператор while
в TypeScript
В TypeScript оператор while
— это конструкция цикла, которая выполняет повторяющийся процесс, пока указанное условие равно true
. Аналогично циклу for
, цикл while
подходит для случаев, когда количество итераций заранее не определено, или когда вы хотите управлять повторением на основе условия.
Базовый синтаксис
1while (condition) {
2 // Code to execute repeatedly while the condition is true
3}
- Условие: Условие, при котором выполняется цикл. Цикл продолжается, пока это условие равно
true
, и останавливается, когда оно становитсяfalse
.
Пример 1: Базовый цикл while
В приведённом ниже примере продолжается вывод значения i
, пока i
меньше 5.
1let i: number = 0;
2
3while (i < 5) {
4 console.log("The value of i is: " + i);
5 i++;
6}
7// Outputs:
8// The value of i is: 0
9// The value of i is: 1
10// The value of i is: 2
11// The value of i is: 3
12// The value of i is: 4
В этом примере цикл заканчивается, когда i
становится равно или больше 5, так как условие становится false
.
Пример 2: Пример бесконечного цикла
Если условие в цикле while
всегда равно true
, он может стать бесконечным. Это обычно приводит к тому, что программа не может завершиться, как планировалось, поэтому требуется осторожность.
1let x: number = 0;
2
3while (true) {
4 console.log("The value of x is: " + x);
5 x++;
6 if (x >= 5) {
7 break; // Exit the loop when the condition is met
8 }
9}
10// Outputs:
11// The value of x is: 0
12// The value of x is: 1
13// The value of x is: 2
14// The value of x is: 3
15// The value of x is: 4
Вы можете использовать оператор break
, чтобы принудительно выйти из цикла при выполнении условия.
Пример 3: цикл do-while
Цикл do-while
— это структура, в которой процесс цикла выполняется как минимум один раз. Поскольку условие проверяется после выполнения процесса, процесс выполняется хотя бы один раз, даже если условие — false
.
1let j: number = 5;
2
3do {
4 console.log("The value of j is: " + j);
5 j++;
6} while (j < 5);
7// Outputs: The value of j is: 5
В этом примере j
равно 5
с самого начала, и j < 5
— это false
, но в цикле do-while
процесс выполняется хотя бы один раз, независимо от условия.
Резюме
- Цикл
while
повторяет процесс, пока условие —true
. - Если условие завершения цикла не очевидно, нужно быть осторожным с бесконечными циклами.
- Цикл
do-while
отличается от обычного циклаwhile
тем, что процесс выполняется хотя бы один раз.
Оператор while
в TypeScript полезен для циклов с неопределённым числом итераций или когда требуется динамическая проверка условий.
break
и continue
Вы можете использовать break
и continue
внутри циклов.
break
используется для досрочного завершения цикла.continue
используется для пропуска текущей итерации и перехода к следующей итерации.
Пример использования break
1for (let i = 0; i < 10; i++) {
2 if (i === 5) {
3 break; // Exits the loop when i is 5
4 }
5 console.log(i);
6}
7// Outputs 0, 1, 2, 3, 4
8
9let i = 0;
10
11while (i < 10) {
12 if (i === 5) {
13 break; // Ends the loop when i is 5
14 }
15 console.log(i++);
16}
17// Outputs 0, 1, 2, 3, 4
В данном случае break
срабатывает, когда i
становится равным 5. В результате будут отображены числа от 0
до 4
.
Пример использования continue
1for (let i = 0; i < 5; i++) {
2 if (i === 2) {
3 continue; // Skips when i is 2
4 }
5 console.log(i);
6}
7// Outputs 0, 1, 3, 4
8
9let i = 0;
10
11while (i < 5) {
12 i++;
13 if (i === 3) {
14 continue; // Skips when i is 3
15 }
16 console.log(i);
17}
18// Outputs 1, 2, 4, 5
В данном случае continue
срабатывает, когда i
равно 2
. В результате отображаются числа, исключая 2
.
Вложенные циклы в TypeScript
Вложенный цикл — это структура, в которой один цикл используется внутри другого цикла. В TypeScript поддерживаются такие конструкции циклов, как for
, while
и do-while
. С помощью вложенных циклов можно обрабатывать двумерные массивы (матрицы) и упрощать обработку на основе нескольких условий.
Базовый синтаксис
Основной синтаксис вложенного цикла выглядит следующим образом.
1for (let i: number = 0; i < n; i++) {
2 for (let j: number = 0; j < m; j++) {
3 // Processing for the inner loop
4 }
5}
Для каждой итерации внешнего цикла внутренний цикл выполняет все свои итерации. Эта структура очень полезна при работе с несколькими циклами или структурами данных.
Пример вложенного цикла в TypeScript
Перебор двумерного массива
Вложенные циклы часто используются при работе с многомерными структурами данных, такими как двумерные массивы. В следующем примере перебираются элементы двумерного массива, и их значения выводятся в консоль.
1const matrix: number[][] = [
2 [1, 2, 3],
3 [4, 5, 6],
4 [7, 8, 9]
5];
6
7for (let row: number = 0; row < matrix.length; row++) {
8 for (let col: number = 0; col < matrix[row].length; col++) {
9 console.log(`matrix[${row}][${col}] = ${matrix[row][col]}`);
10 }
11}
12// Output
13// matrix[0][0] = 1
14// matrix[0][1] = 2
15// matrix[0][2] = 3
16// matrix[1][0] = 4
17// matrix[1][1] = 5
18// matrix[1][2] = 6
19// matrix[2][0] = 7
20// matrix[2][1] = 8
21// matrix[2][2] = 9
В этом примере мы перебираем элементы двумерного массива matrix
. Внешний цикл обрабатывает строки, а внутренний цикл — столбцы, отображая каждый элемент по порядку.
Комбинация двух массивов
Далее мы рассмотрим пример вычисления всех комбинаций двух массивов. Например, вы можете взять по одному элементу из каждого из двух массивов и вывести все возможные пары.
1const array1: string[] = ['A', 'B', 'C'];
2const array2: number[] = [1, 2, 3];
3
4for (let i: number = 0; i < array1.length; i++) {
5 for (let j: number = 0; j < array2.length; j++) {
6 console.log(`Pair: (${array1[i]}, ${array2[j]})`);
7 }
8}
9// Output
10// Pair: (A, 1)
11// Pair: (A, 2)
12// Pair: (A, 3)
13// Pair: (B, 1)
14// Pair: (B, 2)
15// Pair: (B, 3)
16// Pair: (C, 1)
17// Pair: (C, 2)
18// Pair: (C, 3)
В этом примере создаются все пары между строковым массивом array1
и числовым массивом array2
. Внешний цикл извлекает элементы из array1
, а внутренний цикл извлекает элементы из array2
, отображая каждую пару.
Генерация координат с использованием тройного цикла
Используя тройные вложенные циклы, вы можете, например, генерировать координаты в трехмерном пространстве.
1for (let x: number = 0; x < 3; x++) {
2 for (let y: number = 0; y < 3; y++) {
3 for (let z: number = 0; z < 3; z++) {
4 console.log(`Coordinate: (${x}, ${y}, ${z})`);
5 }
6 }
7}
8// Output
9// Coordinate: (0, 0, 0)
10// Coordinate: (0, 0, 1)
11// Coordinate: (0, 0, 2)
12// ...
13// Coordinate: (2, 2, 1)
14// Coordinate: (2, 2, 2)
Таким образом, использование тройных вложенных циклов позволяет легко генерировать координаты в трехмерном пространстве.
Производительность вложенных циклов
Вложенные циклы удобны, но вычислительная стоимость быстро возрастает с увеличением глубины циклов. Например, если во внешнем цикле n
итераций, а во внутреннем цикле m
итераций, общее число итераций составит n * m
. Когда циклы становятся более вложенными, вычислительная сложность увеличивается экспоненциально, что может повлиять на производительность программы.
Ниже приведены вычислительные сложности при переборе трех массивов.
1const array1: number[] = [1, 2, 3];
2const array2: number[] = [4, 5, 6];
3const array3: number[] = [7, 8, 9];
4
5for (let i: number = 0; i < array1.length; i++) {
6 for (let j: number = 0; j < array2.length; j++) {
7 for (let k: number = 0; k < array3.length; k++) {
8 console.log(`Combination: (${array1[i]}, ${array2[j]}, ${array3[k]})`);
9 }
10 }
11}
В данном случае необходимо вычислить array1.length * array2.length * array3.length
, это дает 3 * 3 * 3 = 27
итераций для обработки всех комбинаций.
Оптимизация вложенных циклов
При использовании вложенных циклов вы можете повысить производительность, учитывая следующие оптимизации.
- Используйте ранний выход (early returns): Прерывайте цикл заранее, если цель достигнута, чтобы избежать лишних итераций.
- Кэшируйте переменные цикла: Предварительно сохраняйте значения переменных, используемых в цикле (особенно длины и диапазоны), чтобы снизить затраты на вычисления при каждой итерации.
- Измените структуры данных: Пересмотр структуры массивов и объектов может быть эффективным для ускорения определенных повторяющихся процессов.
Заключение
Вложенные циклы являются мощным инструментом для обработки сложных данных и алгоритмов. Однако с увеличением глубины циклов и числа итераций могут возникнуть проблемы с производительностью. С помощью соответствующих оптимизаций и тщательного проектирования вы можете эффективно использовать вложенные циклы в TypeScript.
Вы можете следовать этой статье, используя Visual Studio Code на нашем YouTube-канале. Пожалуйста, также посмотрите наш YouTube-канал.