Методы массивов в JavaScript: объясняем на пальцах для новичков
Перебираем, сортируем, фильтруем и делаем с массивами всякое.
Иллюстрация: Оля Ежак для Skillbox Media
Это статья для начинающих фронтенд-разработчиков, которые изучают JavaScript и перешли к методам массивов. Рассмотрим основные из них.
Материал разбит на три части. В первой части мы настроим рабочее окружение, чтобы вы могли повторять примеры и экспериментировать с массивами. Если у вас уже всё настроено — пропускайте этот раздел.
Во второй части мы по группам разберём основные методы работы с массивами. Будем объяснять простым языком, начиная с лёгких методов.
В третьей части статьи будет подборка задач на закрепление темы. Попробуйте их решить самостоятельно, а затем сверьте результаты.
Содержание
Настройка рабочего окружения
Интерпретатор JavaScript встроен в любой браузер, поэтому для работы с ним не нужно ничего дополнительно устанавливать. Достаточно открыть браузер, перейти в консоль разработчика и уже можно начинать писать код.
Если у вас установлен Google Chrome, то сперва откройте какую-то страницу. После кликните правой кнопкой мыши на этой странице и выберите в контекстном меню пункт Просмотреть код. Перед вами появится окно с инструментами разработчика, в котором нужно выбрать вкладку Консоль.
Вы можете оставаться в консоли разработчика, но рекомендуем выделить несколько минут на настройку и запустить JavaScript в редакторе VS Code.
Для начала откройте терминал на вашем компьютере и выполните команду:
Если появилось сообщение об ошибке, значит, на вашем компьютере не установлена Node.js — платформа для выполнения JS-кода вне браузера:
Node.js можно скачать с официального сайта и установить как обычную программу. После установки перезапустите терминал и убедитесь, что вместо сообщения об ошибке на экране высвечивается номер версии.
Закрывайте терминал, он нам больше не понадобится. Дальше мы будем работать в редакторе VS Code — скачайте и установите его, если нужно.
В VS Code перейдите в маркетплейс расширений и установите Code Runner — у вас появится кнопка запуска кода в правом верхнем углу окна редактора.
Почти готово. Создайте в редакторе папку, поместите в неё файл с любым именем и расширением .js. Напишите проверочную команду, запустите Code Runner и убедитесь, что JS-код выполнился в редакторе:
Теперь у вас есть всё необходимое для изучения методов массивов. Последняя рекомендация и начинаем: в VS Code под каждую группу методов рекомендуем создавать отдельный файл. Так будет удобно.
Методы для добавления и извлечения элементов
Для начала объявим переменную и добавим в неё массив с фруктами:
Теперь внесём во фруктовый массив первую запись.
Читайте также:
unshift(): добавляет элементы в начало массива
Обратимся к переменной с нашим массивом, через точечную запись получим доступ к методу unshift() и перечислим нужные элементы:
Новые элементы попадут в начало массива, и длина массива изменится:
push(): добавляет элементы в конец массива
Воспользуемся методом push() и добавим элементы в конец массива:
shift(): извлекает элементы из начала массива
Мы передумали добавлять запись в начало массива, но не хотим её потерять. В таких случаях помогает метод shift(): он извлекает первый элемент и, если нужно, позволяет его поместить в новую переменную:
pop(): извлекает элементы из конца массива
С помощью метода pop() удалим последний элемент из конца массива, но только теперь не будем сохранять запись в отдельную переменную:
splice(): добавляет, удаляет или заменяет элементы из любой части массива
Метод splice() изменяет содержимое массива и может выглядеть запутанно:
Однако если разбираться в синтаксисе по частям, то ничего сложного:
- start — это начальный индекс элемента массива, с которого мы хотим начать изменения. Данный параметр может принимать отрицательные индексы, которые указывают на позицию элемента с конца массива.
- deleteCount — это количество элементов, которые мы хотим удалить из массива. Если указать 0, то все элементы останутся. А если не указать никакого значения, то метод удалит все элементы начиная со стартового индекса — того, что мы записали в параметре start.
- item1, item2, … — это список новых элементов, которые нужно добавить после стартового индекса. Эти элементы указывать необязательно.
Теперь посмотрим на примерах варианты использования метода splice().
В первую очередь удалим несколько элементов из середины массива:
Заполним массив новыми элементами вместо удалённых:
Заменим несколько старых элементов на новые:
Оставим в массиве только два фрукта, а остальные удалим:
Методы для формирования новых массивов на основе существующих
Все методы этой группы возвращают новый массив, сохраняя неизменными исходные данные. Создадим исходный массив, на котором попрактикуемся:
slice(): копирует элементы одного массива
Метод slice() позволяет скопировать часть элементов в новый массив:
Разбираемся в синтаксисе:
- start — это стартовый индекс, с которого начинается копирование элементов. Если не указать, то всё начнётся с нулевого индекса.
- end — это конечный индекс, до которого будут копироваться элементы. Если не указать, то скопируются все элементы от стартового индекса до конца выбранного массива.
Стартовый и конечный индексы могут принимать отрицательные аргументы. Это будет означать, что отсчёт элементов нужно проводить с конца массива.
concat(): копирует элементы нескольких массивов
Метод concat() объединяет несколько массивов в один и при необходимости позволяет добавить к ним любые дополнительные значения:
filter(): возвращает массив по условию
Метод filter() перебирает массив и выбирает из него элементы, которые проходят проверку по заданному условию. Это условие записывается в функции обратного вызова (колбэк-функции). Если ни один элемент не будет соответствовать условию, то метод filter() создаст новый пустой массив:
А вот пример формирования пустого массива:
map(): возвращает массив на основе исходного
Метод map() обращается к каждому элементу исходного массива, меняет их через функцию обратного вызова и записывает результат в новый массив:
Методы для проверок и итераций по массиву
Методы этой группы не создают и не изменяют исходный массив. Они лишь выполняют определённые действия с переданным массивом и возвращают запрашиваемый результат. Попрактикуемся на транспортных средствах:
forEach(): перебирает массив и ничего не возвращает
Метод forEach() перебирает каждый элемент массива с помощью функции обратного вызова. Однако в отличие от map(), метод forEach() не возвращает новый массив и не изменяет текущий. То есть вы можете что-то сделать с каждым элементом, посмотреть результат и не записывать его в новый массив. Это удобный аналог цикла for в JavaScript для работы с массивами.
Допустим, мы хотим посмотреть список транспортных средств в массиве. Мы пока ничего не планируем делать, и вот для этого подходит forEach():
Если мы перепишем код с помощью цикла for, то получится более громоздко. Ещё различие: forEach() всегда доходит до конца и перебираем все элементы массива. А вот цикл for можно остановить оператором break. Поэтому в массивах хорошей практикой считается использовать forEach() вместо for.
every(): проверяет, соответствуют ли все элементы массива заданному условию
Метод every() проходится функцией обратного вызова по всему массиву и возвращает булево значение true, если каждый элемент удовлетворяет условию. Если есть хотя бы одно несовпадение — метод every() вернёт false:
some(): проверяет, выполняется ли условие хотя бы для одного элемента массива
Метод some() после перебора массива возвращает true, если хотя бы один элемент соответствует условию. Если совпадений нет — метод вернёт false. Ещё важно знать, что метод some() останавливается на первом совпадении и не перебирает все элементы — ищет хотя бы один подходящий элемент:
Методы для поиска элементов и индексов в массиве
Эта группа методов позволяет найти конкретный элемент, его индекс или убедиться, что он есть в массиве. Потренируемся искать спортинвентарь:
indexOf(): возвращает индекс искомого элемента
Метод indexOf принимает два аргумента: искомый элемент и индекс, с которого должен начинаться поиск. Если в массиве несколько одинаковых элементов, то indexOf вернёт только первый индекс. В случае если нужного элемента не будет, метод вернёт отрицательный индекс со значением -1:
Объяснение синтаксиса:
- searchElement — элемент, который мы хотим найти в массиве.
- fromIndex — номер индекса, с которого должен стартовать поиск. Если этот параметр не указать, то поиск начнётся с начала массива.
Найдём индекс первого баскетбольного мяча:
Поищем индекс второго баскетбольного мяча:
Теперь попробуем отыскать элемент, которого нет в массиве:
lastIndexOf(): возвращает индекс искомого элемента, но начинает поиск с конца массива
Метод lastIndexOf() работает практически так же, как и метод indexOf(). Разница только в том, что lastIndexOf() начинает поиск элемента с конца и возвращает индекс последнего вхождения указанного элемента в массиве:
Разыщем индекс последнего баскетбольного мяча в массиве:
Добавим к методу lastIndexOf() второй аргумент и посмотрим результат:
Немного изменим второй аргумент, чтобы элемент попал в выборку:
includes(): проверяет наличие элемента в массиве
Метод includes() возвращает булево значение true или false. Результат зависит от того, присутствует ли нужный элемент в массиве или же нет. Опционально можно указать индекс, с которого метод начнём проверку:
find(): возвращает первый элемент в массиве, который удовлетворяет условию поиска
Метод find() принимает в качестве аргумента функцию обратного вызова, которая определяет условия для поиска элемента. Если нужный элемент будет найден, то find() его вернёт. Однако если ни один элемент не будет соответствовать условию, то вернётся undefined (значение неопределённо):
Поищем волейбольный мяч:
Усложним условие и поищем что-то кроме мяча:
Методы для преобразования массивов
Эти методы позволяют сортировать, разворачивать и получать единое значение на основе массива. Поэкспериментируем с вредным фастфудом:
sort(): возвращает отсортированный массив
Метод sort() берёт исходный массив, сортирует его определённым образом и возвращает. То есть после применения метода исходный массив изменится.
По умолчанию элементы сортируются в лексикографическом порядке — как строки. Если в массиве будут числа, то метод sort() преобразует их в строки и после отсортирует по кодам символов Unicode. Это произойдёт и с эмодзи.
В нашем массиве есть бургер и пицца:
- U+1F354 — юникод бургера 🍔
- U+1F355 — юникод пиццы 🍕
У символа бургера меньший юникод, поэтому в лексикографическом порядке сортировки он будет перед пиццей. Так же будет и с остальными эмодзи:
Метод sort() позволяет сортировать массив по любому критерию, который вам нужен. Например, по длине строки: от меньшей к большей. Для этого мы должны создать функцию обратного вызова для сравнения длины строк. Переведём эмодзи в текст и посмотрим, как изменится порядок сортировки:
reverse(): разворачивает массив, меняет порядок элементов
Метод reverse() переставляет порядок элементов в исходном массиве: последний элемент становится первым, первый — последним и так далее.
Теперь, если вы проверите индекс первого элемента, то им окажется кусок торта, а не пицца. Это значит, что порядок элементов в массиве изменился:
reduce(): свёртывает элементы массива в единое значение
Метод reduce() применяет функцию обратного вызова последовательно для каждого элемента массива, сохраняет промежуточный результат и выводит общее значение. Это может быть объединённые строки, сумма чисел и так далее.
Разберём процесс по шагам:
- Функция получает начальное значение.
- Переходит к первому элементу массива и начальному значению.
- Получается промежуточный результат, который становится новым начальным значением.
- Функция переходит к следующему элементу массива и обновлённому начальному значению.
- Процесс повторяется, пока функция не пройдёт по всем элементам.
Метод reduce() самый сложный для понимания, поэтому далее массив с эмодзи мы заменим массивом чисел. Так будет проще понять его принцип:
Рассмотрим работу метода reduce() на каждом этапе итерации:
Накопленное значение accumulator | Текущее значение currentValue | Сумма sum | |
---|---|---|---|
Первая итерация | 0 | 1 | 1 |
Вторая итерация | 1 | 2 | 3 |
Третья итерация | 3 | 3 | 6 |
Четвёртая итерация | 6 | 4 | 10 |
Пятая итерация | 10 | 5 | 15 |
А вот так выглядит синтаксис метода reduce():
- callback — это функция, которая будет вызываться для каждого элемента массива. Она может принимать четыре аргумента:
- accumulator — это накопленное значение, которое обновляется после каждого вызова функции.
- currentValue — текущий обрабатываемый элемент массива.
- currentIndex — индекс текущего обрабатываемого элемента. Этот параметр не обязательный, если указано значение initialValue.
- array — это сам массив, на котором мы вызываем метод reduce(). Это также необязательный параметр, если задано initialValue.
- initialValue — это начальное значение аккумулятора, с которого начинается накопление. Если не передано, то начальным значением становится первый элемент массива и перебор идёт со второго элемента.
Ниже будет код, которые поможет лучше разобраться в синтаксисе метода reduce(). Запустите его и посмотрите, что происходит на каждой итерации:
Практика по массивам
Работа с массивами важна для эффективного программирования и изучения популярных фреймворков вроде React. Поэтому чем чаще вы практикуетесь, тем глубже погружаетесь в тему. В этом разделе мы собрали задачи на методы массивов, которые мы разбирали в статье.
Задача на добавление и извлечение элементов
Перед вами список покупок: 🥕, 🥒, 🌽, 🍎, 🍌, 🍇. Создайте для этого списка массив, а затем добавьте по одному новому овощу в начало и конец списка. Добавьте ещё овощей и уберите из массива все фрукты.
Решение
Задача на создание массивов из текущих
В трёх зоопарках содержатся следующие виды животных:
- В первом зоопарке: 🐹 бурундук, 🐿️ белка, 🦁 лев, 🦅🦅🦅 три орла, 🐒 обезьяна, 🐍 змея, 🦉 сова, 🐘 слон, 🐢 черепаха, 🐻 медведь.
- Во втором зоопарке: 🐼 панда, 🐨 коала, 🦆 утка, 🦒 жираф, 🦜🦜🦜 три попугая, 🦅 орёл, 🐯 тигр, 🐧 пингвин, 🐙 осьминог, 🦋 бабочка, 🦔 ёж.
- В третьем зоопарке: 🐸 лягушка, 🐵 обезьяна, 🦅🦅 два орла, 🦜🦜🦜 три попугая, 🦒 жираф, 🐍 змея, 🐢 черепаха, 🦊 лиса.
Поместите животных из каждого зоопарка в отдельный массив: zoo1, zoo2 и zoo3. Объедините все три массива в один общий — allAnimals.
Выберите из общего массива allAnimals всех 🦅 орлов и 🦜 попугаев. Сохраните их в новый массив eaglesParrots. Отправьте орлов и попугаев в ветклинику 🚑 и сохраните результат в новом массиве treatedAnimals.
Решение
Задача на метод forEach()
У вас есть массив с различными транспортными средствами:
Напишите программу, которая будет выводить информацию о каждом транспортном средстве в консоль в таком формате:
Пример вывода:
Решение
Задача на методы every() и includes()
В разделе про метод every() мы использовали цикл for для перебора всех наземных транспортных средств. Перепишите код, чтобы вместо цикла в теле функции оказался метод includes(). Проверьте результат:
Решение
Задача на метод sort()
У вас есть массив с блюдами. Отсортируйте его по длине строк: от меньшего описания блюд к большему. Результат выведите в консоль:
Решение
Задача на метод reduce()
У вас есть массив строк с фруктами. Посчитайте общее количество букв:
Решение
Что дальше
Вы познакомились с основными методами массивов в JavaScript и их базовым синтаксисом. Для дальнейшего изучения массивов советуем обращаться к веб-документации MDN Web Docs от компании Mozilla.
Больше интересного про код — в нашем телеграм-канале. Подписывайтесь!