Часто на практике необходимо работать с данными, как с единым целым. Для таких случаев используются массивы.

Объявление массивов

Пусть у нас есть набор отметок студентов за экзамен и нам нужно узнать среднюю отметку.
function marks() {
let marks = [5, 3, 4, 5, 4];
let sum = marks[0];
sum = sum + marks[1];
sum = sum + marks[2];
sum = sum + marks[3];
sum = sum + marks[4];
return sum / 5;
}
Вызови функцию: marks()

Результат: 4.2

  • Массив объявляется с помощью квадратных скобок, внутри которых через запятую указываются данные.
  • В начале функции мы создали переменную marks и присвоили ей набор отметок.
  • Далее присвоили переменной sum элемент массива marks[0].
  • Чтобы получить элемент массива, нужно написать имя массива и в квадратных скобках — индекс (номер) элемента.

В JS элементы массива нумеруются с 0.

Таким образом, в массиве marks = [5, 3, 4, 5, 4] нулевым элементом (marks[0]) будет самое первое число — 5.

Первым элементом marks[1] будет 3.

Вторым элементом marks[2] будет 4.

Третьим элементом marks[3] будет 5.

Четвёртым элементом marks[4] будет 4.

Больше в массиве нет элементов, поэтому при попытке получить, например, пятый элемент marks[5], мы получим undefined.

Итак, в переменной sum хранится сумма всех пяти элементов массива (от 0 до 4).

Далее мы делим значение sum на количество отметок 5 и возвращаем результат с помощью return.

Массив может быть пустым — тогда скобки остаются пустыми:

let array = [];
Массив может состоять не только из чисел, но и из других типов данных. Например, из строк:
let array = ["Hello", "World"];
Также в одном массиве можно хранить данные разных типов:
let array = [0, 1.0, "Hello", 3.0, "World!", 5];
Упражнения
4.1.1. Напиши функцию, которая создаёт массив цветов ["red", "green", "blue"]. Функция принимает один параметр — индекс цвета — и возвращает сам цвет по этому индексу. Если индекс больше 2, должна выводиться ошибка.
4.1.2. Напиши функцию, которая создаёт массив вычисленных значений факториала от до 5: [1, 1, 2, 6, 24, 120]. Функция принимает один параметр — число, для которого нужно взять факториал, — и возвращает само значение факториала. Если индекс больше 5, должна выводиться ошибка.
Примечание: факториал числа — это произведение всех чисел по порядку от до n. Вычисление факториала — это задача, требующая много вычислительных ресурсов. Чтобы каждый раз, когда нужно значение факториала, заново его не вычислять, можно один раз вычислить и сохранить результат в массив, а затем просто брать значение из массива. Таким образом, факториал числа будет храниться в элементе массива с индексом 3: factorial[3] = 6.
4.1.3. Напиши функцию, которая создаёт массив вычисленных чисел Фибоначчи от 0 до 10: [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]. Функция принимает один параметр — число, для которого нужно взять число Фибоначчи, и возвращает само значение числа Фибоначчи. Если индекс больше 10, должна выводиться ошибка.
Примечание: числа Фибоначчи — это последовательность, в которой первые два числа равны 0 и 1, а каждое последующее число равно сумме двух предыдущих. Вычисление чисел Фибоначчи — это задача, требующая много вычислительных ресурсов. Чтобы каждый раз заново не вычислять, можно один раз вычислить и сохранить результат в массив, а затем просто брать значение из массива. Таким образом, число Фибоначчи для индекса 7 будет храниться в элементе массива: fibonacci[7] = 13.
4.1.4. Напиши функцию, которая создаёт массив жильцов в подъезде: ["", "Иван", "Пётр", "Максим", "Анна", "Илья"]. Функция принимает один параметр — номер квартиры — и возвращает имя жильца в этой квартире. Квартиры 0 не существует, поэтому в массив по индексу 0 запишем пустую строку. Если индекс меньше 1, должна выводиться ошибка. Если индекс больше 5, должна выводиться ошибка.

Перебор элементов массива

В чём же удобство использования массивов? Давай рассмотрим следующую ситуацию.

Наша функция может посчитать среднюю отметку пяти студентов. А если мы добавим ещё одну отметку?

Тогда функцию придётся немного поменять:
function marks() {
let marks = [5, 3, 4, 5, 4, 3]; // добавили отметку 3 в конец массива
let sum = marks[0];
sum = sum + marks[1];
sum = sum + marks[2];
sum = sum + marks[3];
sum = sum + marks[4];
sum = sum + marks[5]; // добавили новую отметку к сумме отметок
return sum / 6; // изменили количество отметок с 5 на 6
}
А что, если добавим ещё и ещё? Каждый раз при изменении массива нам нужно будет менять функцию в 3 местах. Когда отметок станет несколько десятков, функцию станет очень трудно менять.

Обрати внимание, что в нашем примере много повторяющегося кода: sum = sum + marks[1]. По сути, мы выполняем одно и то же действие несколько раз, меняя только индекс элемента массива.

Но мы уже знаем удобный механизм в JS, позволяющий сделать нашу функцию более простой и легко изменяемой. Это циклы.
function marks() {
let marks = [5, 3, 4, 5, 4, 3];
let sum = 0;
for (let i = 0; i < marks.length; i = i + 1) {
sum = sum + marks[i];
}
return sum / marks.length;
}
  • Итак, после объявления массива marks мы объявили переменную sum и присвоили ей начальное значение 0.
  • Далее объявили цикл for. С его помощью мы будем перебирать все элементы массива.
  • Внутри цикла объявили переменную i и присвоили ей значение первого индекса массива — 0.
  • Далее в теле цикла мы будем прибавлять к переменной sum значение i-элемента массива: сначала нулевого, потом первого, потом второго...

Получается, нам нужно переменную i каждый раз увеличивать на 1 до тех пор, пока i меньше количества элементов.

Чтобы получить количество элементов массива (длину массива), в JS можно использовать конструкцию marks.length.

Поэтому условие цикла будет i < marks.length.

И в конце сумму отметок делим на количество отметок: sum / marks.length.

Вызови функцию marks()

Результат: 4.
function marks() {
let marks = [5, 3, 4, 5, 4, 3]; // объявляем массив из 6 чисел
let sum = 0; // объявляем переменную sum, в которой будем хранить сумму элементов
for (let i = 0; i < marks.length; i = i + 1) { // для переменной i от 0 до длины массива marks.length
sum = sum + marks[i]; // прибавляем к переменной sum значение i-элемента массива
} // конец цикла
return sum / marks.length; // возвращаем среднее: сумму элементов, делённую на количество
}
Как и обычные переменные, массивы можно передавать в функции:
function excellents(marks) {
let count = 0;
for (let i = 0; i < marks.length; i = i + 1) {
if (marks[i] == 5) {
count = count + 1;
}
}
return count;
}
Вызови функцию excellents([5, 3, 4, 5, 4, 3])
Результат: 2
Данная функция принимает массив и считает, сколько в нём отметок 5.
function excellents(marks) {
let count = 0; // объявляем переменную count, в которой будем хранить количество отметок 5
for (let i = 0; i < marks.length; i = i + 1) { // для переменной i от 0 до длины массива
marks.lengthif (marks[i] == 5) { // если i-отметка равна 5
count = count + 1; // увеличиваем количество на 1
} // конец условия
} // конец цикла
return count; // возвращаем количество отметок 5
}
Упражнения
4.2.1. Напиши функцию, которая принимает массив чисел, а возвращает сумму тех, значения которых больше 0, но меньше 10.
4.2.2. Напиши функцию, которая принимает массив чисел, а возвращает максимальное число в массиве.
4.2.3. Напиши функцию, которая принимает массив строк, а возвращает одну строку, которая объединяет все элементы массива.
4.2.4. Напиши функцию, которая создаёт и возвращает массив из 10 элементов (от 0 до 9). Каждый элемент массива — это массив. Например, array[3] = [3, 3, 3].
4.2.5. Напиши функцию, которая создаёт и возвращает массив студентов:

  • Иван, 20 лет, м.
  • Пётр, 23 года, м.
  • Максим, 18 лет, м.
  • Анна, 23 года, ж.
  • Илья, 24 года, м.
Каждый элемент массива — это массив информации о конкретном студенте (имя, возраст, пол). Например, students[2] = ["Максим", 18, "м"].

Функции для работы с массивами

Часто в коде необходимо изменять массив: добавлять элементы в конец, в начало, в середину, удалять.

Давай рассмотрим, как это можно сделать в JS.
function marks() {
let marks = [5, 5, 5, 5, 5];
marks.push(2, 3, 4);
return marks;
}
Вызови функцию: marks()

Результат: [5, 5, 5, 5, 5, 2, 3, 4]

С помощью конструкции marks.push() можно добавлять новые элементы в конец массива. В скобках через запятую указываются новые элементы.
function marks() {
let marks = [5, 5, 5, 5, 5];
marks.unshift(2, 3, 4);
return marks;
}
Вызови функцию: marks()

Результат: [2, 3, 4, 5, 5, 5, 5, 5]

С помощью конструкции marks.unshift() можно добавлять новые элементы в начало массива. В скобках через запятую указываются новые элементы.
function marks() {
let marks = [5, 5, 5, 5, 5];
marks.pop();
return marks;
}
Вызови функцию: marks()

Результат: [5, 5, 5, 5]

С помощью конструкции marks.pop() из массива можно удалить последний элемент. Но также эта команда позволяет извлечь последний элемент массива и потом сохранить его в переменную.
function marks() {
let marks = [5, 5, 5, 5, 3];
let last = marks.pop();
return last;
}
Вызови функцию: marks()

Результат: 3
function marks() {
let marks = [3, 5, 5, 5, 5];
marks.shift();
return marks;
}
Вызови функцию: marks()

Результат: [5, 5, 5, 5]

С помощью конструкции marks.shift() из массива можно удалить первый элемент. Но также эта команда позволяет извлечь первый элемент массива и потом сохранить его в переменную.
function marks() {
let marks = [3, 5, 5, 5, 5];
let first = marks.shift();
return first;
}
Вызови функцию: marks()

Результат: 3

А если надо удалить элементы в середине массива? И не один, а сразу несколько?
function marks() {
let marks = [5, 5, 4, 3, 2, 5];
marks.splice(2, 3);
return marks;
}
Вызови функцию: marks()

Результат: [5, 5, 5]

С помощью конструкции marks.splice(start, count) из любого места массива можно удалить несколько элементов.

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

А в качестве параметра count следует задать количество удаляемых элементов.

В данном примере мы, начиная со второго индекса, удаляем три элемента: marks.splice(2, 3).

Второй (начиная с нуля) элемент массива — это 4. Соответственно, мы удалим три элемента: 4, 3, 2.

Конструкция marks.splice() возвращает массив удалённых элементов, которые при необходимости мы можем далее в коде использовать:
function marks() {
let marks = [5, 5, 4, 3, 2, 5];
let removed = marks.splice(2, 3);
return removed;
}
Вызови функцию: marks()

Результат: [4, 3, 2]

А если надо вставить элементы в середину массива?
function marks() {
let marks = [5, 5, 5, 5, 5];
marks.splice(2, 0, 2, 3, 4);
return marks;
}
Вызови функцию: marks()

Результат: [5, 5, 2, 3, 4, 5, 5, 5]

С помощью той же конструкции marks.splice(start, 0, item1, item2, ...) можно вставить элементы в любое место массива. Для этого в качестве параметра start следует задать индекс, куда будет вставлен первый элемент. Нумерация начинается с 0. В качестве второго параметра count следует передать 0. Это означает, что мы не будем удалять элементы из массива. Далее через запятую следует указать добавляемые элементы.

В данном примере мы, начиная со второго индекса, вставили элементы 2, 3, 4: marks.splice(2, 0, 2, 3, 4).

Также часто требуется объединять массивы:
function marks() {
let marks1 = [5, 5, 5, 5, 5];
let marks2 = [4, 4, 4, 4];
let marks = marks1.concat(marks2);
return marks;
}
Вызови функцию: marks()

Результат: [5, 5, 5, 5, 5, 4, 4, 4, 4]

Объединять можно и несколько массивов:
function marks() {
let marks1 = [5, 5, 5, 5, 5];
let marks2 = [4, 4, 4, 4];
let marks3 = [3, 3, 3];
let marks = marks1.concat(marks2, marks3);
return marks;
}
Вызови функцию: marks()

Результат: [5, 5, 5, 5, 5, 4, 4, 4, 4, 3, 3]

С помощью конструкции marks.concat() можно объединять массивы. В скобках через запятую указываются массивы для добавления к marks.
Упражнения
4.3.1. Напиши функцию, которая принимает 2 параметра. Первый параметр — исходный массив чисел. Второй — число. Функция должна добавить число из второго параметра в конец исходного массива и вернуть полученный новый массив.
4.3.2. Напиши функцию, которая принимает 3 параметра. Первый параметр — исходный массив чисел. Второй — число, которое нужно вставить в массив. Третий — индекс, куда нужно вставить это число.
4.3.3. Напиши функцию, которая принимает один параметр — массив, и возвращает другой массив с теми же элементами в обратном порядке.
4.3.4. Напиши функцию, которая принимает один параметр — массив чисел (положительных и отрицательных), и удаляет из этого массива все отрицательные числа.
4.3.5. Напиши функцию, которая принимает два параметра — массивы чисел, и возвращает единый массив, в котором каждый элемент — сумма соответствующих элементов исходных массивов. Массивы на входе могут иметь разные размеры. Например, на входе массивы [1, 2, 3, 4, 5] и [9, 8, 7], на выходе: [10, 10, 10, 4, 5].