JavaScript · Синтаксис · Начальный уровень

Цикл for и массивы

15 задач

Практика цикла for в JavaScript на массивах: перебор элементов, фильтрация значений, подсчёты, поиск минимума и максимума, работа со строками, датами и вложенными данными.

Цикл for...of и массивы

#
В JavaScript нет кортежей — массивы покрывают оба варианта использования. Идиоматический способ итерации по массиву — цикл for...of: ```javascript const numbers = [3, 7, 1, 9, 4]; for (const n of numbers) { console.log(n); } ``` На каждой итерации n содержит следующий элемент. Когда массив заканчивается — цикл завершается. Та же синтаксическая форма работает со строками — они итерируются символ за символом. for...of появился в ES6 и является предпочтительным современным синтаксисом. Старый код использует индексные for-циклы — вы увидите оба варианта, но for...of читается понятнее для большинства задач. Когда нужны и индекс, и значение — используйте entries(): ```javascript const days = ["Monday", "Tuesday", "Wednesday"]; for (const [i, day] of days.entries()) { console.log(`День ${i + 1}: ${day}`); } ``` entries() возвращает пары [индекс, значение]. Деструктуризация [i, day] распаковывает каждую пару прямо в заголовке цикла. Это JavaScript-аналог Python's enumerate().

Построение массивов во время итерации

#
Многие задачи с for имеют одинаковую форму: начинаем с пустого массива, проходим по источнику, решаем, включать ли каждый элемент, и добавляем выбранных через push(). ```javascript const numbers = [2, 5, 0, 8, 11, 14, 17, 0]; const result = []; for (const n of numbers) { if (n % 2 === 0 && n !== 0) { result.push(n); } } console.log(result); ``` push() добавляет элемент в конец массива. Это аналог Python's append(). Накопление суммы: ```javascript const numbers = [5, 10, 15, 20]; let total = 0; for (const n of numbers) { total += n; } console.log(total); ``` Отслеживание текущего максимума — начинаем с первого элемента, обновляем, когда находим что-то большее: ```javascript const numbers = [8, 3, 15, 6, 2]; let maxNum = numbers[0]; for (const n of numbers) { if (n > maxNum) { maxNum = n; } } console.log(maxNum); ``` Начинать с numbers[0] вместо 0 важно. Если все числа отрицательные, начало с 0 дало бы неправильный ответ.

Ключевые паттерны из задач

#
Объединение элементов массива в строку — в JavaScript массивы имеют встроенный метод join(): ```javascript const numbers = [3, 7, 1, 9, 4]; const result = numbers.join("-"); console.log(result); // 3-7-1-9-4 ``` join() автоматически преобразует каждый элемент в строку. Явное преобразование не нужно, если не требуется форматировать отдельные значения. Построение массива пар — объединяем каждый элемент с вычисленными данными: ```javascript const words = ["JavaScript", "is", "fast"]; const result = []; for (const word of words) { result.push([word, word.length]); } console.log(result); // [['JavaScript', 10], ['is', 2], ['fast', 4]] ``` Фильтрация по свойству строки: ```javascript const words = ["javascript", "java", "go", "python", "c"]; let count = 0; for (const word of words) { if (word.length > 5) { count++; } } console.log(count); ``` Разбор структурированных данных — разбиваем строку по разделителю, затем сравниваем части. Задача на фильтрацию дат: разбить по "-", затем сравнить год и месяц как числа.
01

Числа через дефис.

#

Дан массив чисел. Выведите каждое число из массива в той же строке в терминале через дефис. 3-7-1-9-4

let numbers = [3, 7, 1, 9, 4];
Решение
let numbers = [3, 7, 1, 9, 4];
let result = "";
for (let n of numbers) {
    result += String(n) + "-";
}
result = result.slice(0, -1);
console.log(result);

// или самый короткий вариант через join
let numbers = [3, 7, 1, 9, 4];
let result = numbers.join("-");
console.log(result);
02

Чётные числа без нулей.

#

Дан массив чисел. Добавьте в новый массив только чётные числа, нули пропустить.

let numbers = [2, 5, 0, 8, 11, 14, 17, 0];
let newItems = [];
Решение
let numbers = [2, 5, 0, 8, 11, 14, 17, 0];
let newItems = [];
for (let n of numbers) {
    if ((n !== 0) && (n % 2 === 0)) {
        newItems.push(n);
    }
}
console.log(newItems);

// или так можно: сначала проверить ноль, а потом чётность
let numbers = [2, 5, 0, 8, 11, 14, 17, 0];
let result = [];

for (let n of numbers) {
    if (n === 0) {
        continue;
    }
    if (n % 2 === 0) {
        result.push(n);
    }
}

console.log(result);
03

Сумма элементов массива.

#

Дан массив чисел. Найдите сумму всех элементов массива.

let numbers = [5, 10, 15, 20];
let total = 0;
Решение
let numbers = [5, 10, 15, 20];
let total = 0;
for (let n of numbers) {
    total += n;
}
console.log("Сумма:", total);

// или так можно через reduce, когда этот метод уже знаком
let numbers = [5, 10, 15, 20];
let total = numbers.reduce((sum, n) => sum + n, 0);
console.log("Сумма:", total);
04

Непустые строки.

#

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

let words = ["0000-0000-0000-0000", "", "1111-1111-1111-1111", "2222-2222-2222-2222", ""];
let newWords = [];
Решение
let words = ["0000-0000-0000-0000", "", "1111-1111-1111-1111", "2222-2222-2222-2222", ""];
let newWords = [];
for (let w of words) {
    if (w !== "") {
        newWords.push(w);
    }
}
console.log(newWords);
05

Квадраты чисел больше 10.

#

Дан массив чисел. Создайте новый массив, в котором будут возведённые в квадрат только числа больше 10.

let numbers = [3, 12, 5, 18, 7, 25];
let result = [];
Решение
let numbers = [3, 12, 5, 18, 7, 25];
let result = [];
for (let n of numbers) {
    if (n > 10) {
        result.push(n ** 2);
    }
}
console.log(result);

// или так можно: сначала сохранить квадрат в переменную
let numbers = [3, 12, 5, 18, 7, 25];
let result = [];

for (let n of numbers) {
    if (n > 10) {
        let square = n ** 2;
        result.push(square);
    }
}

console.log(result);
06

Дни недели с номерами.

#

Дан массив с названиями дней недели. Выведите каждый день в формате: "День X: <название>" .

let days = ["Понедельник", "Вторник", "Среда", "Четверг", "Пятница"];
Решение
let days = ["Понедельник", "Вторник", "Среда", "Четверг", "Пятница"];
let dayNum = 1;
for (let day of days) {
    console.log(`День ${dayNum}: ${day}`);
    day_num += 1;
}

// или так можно через обычный индекс
let days = ["Понедельник", "Вторник", "Среда", "Четверг", "Пятница"];

for (let i = 0; i < days.length; i += 1) {
    console.log(`День ${i + 1}: ${days[i]}`);
}
07

Максимум через цикл.

#

Дан массив чисел. Найдите максимальное число в массиве, используя цикл for .

let numbers = [8, 3, 15, 6, 2];
let maxNum = numbers[0];
Решение
let numbers = [8, 3, 15, 6, 2];
let maxNum = numbers[0];

for (let n of numbers) {
    if (n > maxNum) {
        maxNum = n;
    }
}

console.log("Максимум:", maxNum);

// или так можно:
let numbers = [8, 3, 15, 6, 2];
let maxNum = Math.max(...numbers);
console.log("Максимум:", maxNum);
08

Строки длиннее 5 символов.

#

Дан массив строк. Подсчитайте, сколько строк длиннее 5 символов.

let words = ["javascript", "java", "go", "javascript", "c"];
let count = 0;
Решение
let words = ["javascript", "java", "go", "javascript", "c"];
let count = 0;
for (let w of words) {
    if (w.length > 5) {
        count += 1;
    }
}
console.log("Количество строк:", count);
09

Положительные числа из массива.

#

Дан массив чисел. Выведите только те числа, которые больше 0.

let numbers = [-3, 5, -1, 7, 0, -2];
Решение
let numbers = [-3, 5, -1, 7, 0, -2];
for (let n of numbers) {
    if (n > 0) {
        console.log(n);
    }
}
10

Строка через запятую.

#

Дан массив строк. Создайте строку, которая будет состоять из всех элементов массива, разделённых запятой и пробелом.

let words = ["JavaScript", "это", "круто"];
let result = "";
Решение
let words = ["JavaScript", "это", "круто"];
let result = "";
for (let w of words) {
    result += w + ", ";
}
result = result.slice(0, -2);
console.log(result);

// или короче через join
let words = ["JavaScript", "это", "круто"];
let result = words.join(", ");
console.log(result);
11

Слова и их длина.

#

А будьте так любезны 🧐, создать из этого массива строк новый массив, в котором элементами будут массивы. В каждом массиве два элемента: строка и ее длина например: words = ["JavaScript", "это", "круто"] new = [["JavaScript", 10], ["это", 3], ["круто", 5]]

let words = ["JavaScript", "это", "круто"];
let newItems = [];
Решение
let words = ["JavaScript", "это", "круто"];
let newItems = [];
for (let word of words) {
    let t = [word, word.length];
    newItems.push(t);
}
console.log(newItems);

// или так можно без промежуточной переменной
let words = ["JavaScript", "это", "круто"];
let result = [];

for (let word of words) {
    result.push([word, word.length]);
}

console.log(result);
12

Символы строки в нижнем регистре.

#

Хм... Срочно нужно сделать из этой строки "Этой", массив, который будет состоять из символов этой строки в нижнем регистре!!! (маленькие буковки)

let word = "Этой";
Решение
let word = "Этой";
let arr = Array.from(word.toLowerCase());
console.log(arr);

// или через цикл, чтобы явно увидеть добавление каждого символа
let word = "Этой";
let arr = [];

for (let char of word) {
    arr.push(char.toLowerCase());
}

console.log(arr);
13

Номер карты через дефис.

#

Опять же срочно! Какой-то умник сохранил номер банковской карты в виде массива по 4 цифры карты: card = ["1111", "2222", "3333", "4444"] Сделайте из этого строку в таком формате: norm_card = "1111-2222-3333-4444"

let card = ["1111", "2222", "3333", "4444"];
Решение
let card = ["1111", "2222", "3333", "4444"];

let normCard = card.join("-");

console.log(normCard);

// или так:
let card = ["1111", "2222", "3333", "4444"];

let normCard = "";

for (let part of card) {
    normCard += part + "-";
}

normCard = normCard.slice(0, -1);

console.log(normCard);
14

Минимум, максимум и среднее.

#

Продолжаем срочный квест! Найдите по быстрому: - минимальное значение в массиве; - максимальное значение в массиве; - сумму всех значений в массиве; - среднее арифметическое значений в массиве. А потом, по желанию, не по быстрому.

let arr = [10, 100, 500, 11, 18, 99, -3, 101];
Решение
// по быстрому

let numbers = [5, 2, 9, 1, 7];

let minNum = Math.min(...numbers);
let maxNum = Math.max(...numbers);

let total = numbers.reduce((sum, n) => sum + n, 0);

let average = total / numbers.length;

console.log("Минимум:", minNum);
console.log("Максимум:", maxNum);
console.log("Сумма:", total);
console.log("Среднее:", average);

// не по быстрому

let numbers = [5, 2, 9, 1, 7];

let minNum = numbers[0];
let maxNum = numbers[0];
let total = 0;

for (let n of numbers) {
    if (n < minNum) {
        minNum = n;
    }

    if (n > maxNum) {
        maxNum = n;
    }

    total += n;
}

let average = total / numbers.length;

console.log("Минимум:", minNum);
console.log("Максимум:", maxNum);
console.log("Сумма:", total);
console.log("Среднее:", average);
15

Фильтр дат после 2027.09.01.

#

На последок, за 5 минут до окончания рабочего дня нужно: Есть массив с датами в четком формате yyyy.mm.dd: dates = ["2027.09.25", "2027.10.14", "2027.03.01", "2027.12.29", "2027.09.11", "2027.05.06"] Нужен новый массив где будут только даты после 2027.09.01. Подсказка: попробуйте посравнивать строки через < - > , иногда это полезно😉.

let dates = ["2027.09.25", "2027.10.14", "2027.03.01", "2027.12.29", "2027.09.11", "2027.05.06"];
let newItems = [];
Решение
let dates = ["2027.09.25", "2027.10.14", "2027.03.01", "2027.12.29", "2027.09.11", "2027.05.06"];
let newItems = [];
for (let date of dates) {
    if (date >= "2027.09.01") {
        newItems.push(date);
    }
}
console.log(newItems);