Что такое массивы?
Массивы — это структура, в которой можно хранить коллекции элементов разных типов данных — чисел, строк, других массивов и так далее. Элементы нумеруются и хранятся в том порядке, в котором их добавили в массив. Элементов может быть сколько угодно.
let arr = [];
Массивы хранят элементы в пронумерованных «ячейках». Нумерация начинается с нуля. Первый элемент массива будет иметь номер 0, второй — 1 и так далее. Номера называют индексами.
Количество доступных ячеек — это длина массива. В JavaScript длина массива обычно
совпадает
с количеством элементов в нем. Массивы хранят свой размер в свойстве .length
:
let arr = [1, 2, 3, 4, 5];
alert(arr.length);
// выведет 5
Чтобы получить содержимое ячейки, нужно обратиться к конкретному индексу с помощью квадратных скобок:
let arr = [1, 2, 3, 4, 5];
const arrFirst = arr[0];
alert(arrFirst);
// выведет 1
С помощью квадратных скобок можно также добавлять элементы в массив. Если в массиве
есть пропущенные индексы, то при его выводе появляются «лишние» запятые, а при обращении к несуществующим
элементам возвращается значение undefined
:
let arr = [1, 2, 3, 4, 5];
arr[5] = 6;
// добавляем элемент под индексом 5
alert(arr);
// выведет 1, 2, 3, 4, 5, 6
arr[8] = 9;
// добавляем элемент под индексом 8, игнорируя пропущенные индексы 6 и 7
alert(arr);
// выведет 1, 2, 3, 4, 5, 6, , , 9
// получился массив с "дыркой"
alert(arr[7]);
// undefined, так как элемент под индексом 7 отсутствует
Методы массивов
Методы массивов предоставляют разработчику удобные инструменты, позволяющие красиво решать разнообразные задачи по преобразованию данных. Бывают методы копирования, удаления и добавления элементов, методы, которые изменяют исходный массив или возвращают новый, а также многие другие.
В нашем справочнике методы массивов разделены на две большие группы, которые различаются возможностью принимать функцию обратного вызова (callback function). Методы, которые не могут принимать колбэк, объединены в первую группу, а методы, принимающие колбэк — во вторую.
Методы, не принимающие callback function
В эту группу включены методы добавления и удаления, поиска, преобразования, а также другие.
Добавление и удаление элементов
-
pop
chevron_rightУдаляет последний элемент из массива и возвращает его значение.
Если метод применяется к пустому массиву, то возвращаемое значение метода будетundefined
.array.pop(); // не принимает аргументов
Пример:
let fruits = ["Вишня", "Абрикос", "Черника"]; alert(fruits.pop()); // удаляем "Черника" и выводим это значение alert(fruits); // Вишня, Абрикос
Практика
Дан пустой массив, куда нужно добавить элементы и применить метод
pop()
:array.pop(); alert(array);let array =
[];Исходный массив:
Значение, которое возвращается:
Преобразованный массив:
-
push
chevron_rightДобавляет один или более элементов в конец массива.
Синтаксис:array.push(element0, element1, ..., elementN);
Пример:
let fruits = ["Вишня", "Абрикос"]; fruits.push("Черника"); // добавляем "Черника" alert(fruits); // выведет Вишня, Абрикос, Черника
Практика
Дан пустой массив, куда нужно добавить элементы и применить метод
push()
:array.push("Новый элемент"); alert(array);let array =
[];Исходный массив:
Преобразованный массив:
-
shift
chevron_rightУдаляет из массива первый элемент и возвращает его значение.
Если метод применяется к пустому массиву, то возвращаемое значение метода будетundefined
.array.shift(); // не принимает аргументов
Пример:
let fruits = ["Вишня", "Абрикос", "Черника"]; alert(fruits.shift()); // удаляем "Вишня" и выводим это значение alert(fruits); // Абрикос, Черника
Практика
Дан пустой массив, куда нужно добавить элементы и применить метод
shift()
:array.pop(); alert(array);let array =
[];Исходный массив:
Значение, которое возвращается:
Преобразованный массив:
-
unsift
chevron_rightДобавляет элементы в начало массива.
Синтаксис:array.unshift(element0, element1, ..., elementN);
Пример:
let fruits = ["Абрикос", "Черника"]; fruits.unshift("Вишня"); // добавляем "Вишня" alert(fruits); // выведет Вишня, Абрикос, Черника
Практика
Дан пустой массив, куда нужно добавить элементы и применить метод
unshift()
:array.unshift("Новый элемент"); alert(array);let array =
[];Исходный массив:
Преобразованный массив:
-
splice
chevron_rightИзменяет текущий массив, добавляя, удаляя или замещая элементы.
Возвращает новый массив из удаленных элементов.arr.splice(start, deleteCount, element1, ..., elementN) // начиная с позиции start, метод удаляет deleteCount элементов // и вставляет element1, ..., elementN на их место
Параметры:
-
start
— индекс элемента массива, с которого будут удалены из массива и/или добавлены в массив элементы; можно использовать отрицательные значения, в этом случаеstart
расчитывается по формулеarr.length + start
; -
deleteCount
(необязательное значение) — число, определяющее количество удаляемых из массива элементов; еслиdeleteCount
равен 0, то элементы не удаляются; если значениеdeleteCount
больше количества оставшихся элементов в массиве, то будут удалены все элементы до конца массива; -
elementN
(необязательное значение) — добавляемые к массиву элементы. Если не указывать никакого элемента,splice()
просто удалит элементы из массива.
Рассмотрим примеры применения метода
splice()
.Удаление:
let fruits = ["Банан", "Яблоко", "Мандарин"]; alert(fruits.splice(0, 1)); // начиная с индекса 0, удалить 1 элемент // и вывести удаленный элемент (Банан) alert(fruits); // массив изменился - Яблоко, Мандарин
Замена:
let fruits = ["Банан", "Яблоко", "Мандарин"]; alert(fruits.splice(0, 2, "Манго")); // начиная с индекса 0, удалить 2 элемента, // заменить их на "Манго" // и вывести удаленные элементы (Банан, Яблоко) alert(fruits); // измененный массив - Манго, Мандарин
Добавление:
let fruits = ["Банан", "Яблоко", "Мандарин"]; alert(fruits.splice(1, 0, "Манго", "Груша")); // начиная с индекса 1, удалить 0 элементов // и добавить "Манго", "Груша" // вернется пустой массив, потому что ничего не было удалено alert(fruits); // массив после преобразования: Банан, Манго, Груша, Яблоко, Мандарин
Практика
Дан пустой массив, куда нужно добавить элементы и применить метод
splice()
для замены элементов:array.splice(1, 2, "Новый элемент"); alert(array);let array =
[];Исходный массив:
Значение, которое возвращается:
Преобразованный массив:
-
-
slice
chevron_rightИзвлекает часть массива и возвращает новый массив.
Синтаксис:array.slice(start, end);
Параметры:
-
start
— индекс элемента массива, с которого будут выбраны элементы; если start опущен, то значение по умолчанию будет 0; можно использовать отрицательные значения, в этом случаеstart
расчитывается по формулеarr.length + start
; -
end
— индекс элемента массива, на котором будет заканчиваться извлечение элементов массива (не включая его); если этот параметр не указан, то будут выбраны все элементы отstart
и до конца массива; можно использовать отрицательные значения, в этом случаеend
расчитывается по формулеarr.length + end
.
Пример применения метода:
let fruits = ["Банан", "Яблоко", "Мандарин"]; alert(fruits.slice(0, 2)); // копирует с индекса 0 до индекса 2, не включая его // вернется Банан, Яблоко alert(fruits.slice(-1)); // копирует с индекса -1 до конца массива // вернется Мандарин
Практика
Дан пустой массив, куда нужно добавить элементы и применить метод
slice()
:array.slice(0, 2);let array =
[];Исходный массив:
Новый массив:
-
-
concat
chevron_rightСоединяет массивы и значения в новый массив.
Выполняет конкатенацию массивов: создает и возвращает новый массив, который является результатом присоединения каждого из его аргументов к массиву.array.concat(value1, value2, ..., valueN);
Если какие-либо из аргументов
concat()
сами являются массивами, то присоединяются элементы этих массивов, а не сами массивы.let fruits = ["Банан", "Яблоко", "Мандарин"]; let orange = "Апельсин"; let berries = ["Вишня", "Черника", 2]; alert(fruits.concat(orange, berries)); // создаёт новый массив, не изменяя исходный // выведет Банан, Яблоко, Мандарин, Апельсин, Вишня, Черника, 2
Практика
Дан пустой массив, куда нужно добавить элементы и применить метод
concat()
:let string = "Манго"; let number = 100; let berries = ["Вишня", "Черника"]; array.concat(string, number, berries);let array =
[];Исходный массив:
Новый массив:
Преобразование элементов
-
join
chevron_rightОбъединяет все элементы массива в строку.
Преобразует каждый из элементов массива в строку и затем выполняет конкатенацию этих строк, вставляя указанный разделитель между элементами.array.join(separator);
separator
— необязательный параметр. Это символ или строка для отделения одного элемента массива от следующего в итоговой строке. По умолчанию элементы массива разделяются запятыми. Если разделитель — пустая строка, элементы массива ничем не разделяются. Еслиarray.length === 0
, то будет возвращена пустая строка.join()
делает в точности противоположное строковому методуsplit()
. Методsplit()
разбивает строку на массив по заданному разделителю:let string = "Банан, Яблоко, Мандарин"; let fruits = string.split(', '); for (let fruit of fruits) { alert( `Фрукты: ${fruit}.` ); } // выведет по порядку элементы массива: Фрукты: Банан (и т.д.)
А сейчас с помощью
join()
можно преобразовать элементы обратно в строку:let fruits = ["Банан", "Яблоко", "Мандарин"]; let string = fruits.join(', '); alert(string); // выведет строку с элементами через запятую и пробел
Практика
Дан пустой массив, куда нужно добавить элементы и применить метод
join()
:let string = array.join(', ');let array =
[];Исходный массив:
Новая строка:
-
sort
chevron_rightСортирует элементы массива.
Элементы сортируются на месте без создания копии массива.array.sort(compareFunction);
Метод
sort()
может принимать функцию обратного вызова, но это не итерационный метод.sort()
изменяет массив на месте, не принимаетthisArg
и может вызывать обратный вызов несколько раз для одного индекса.Функция
compareFunction
— необязательный параметр. Она может применяться для определения порядка элементов.Если
sort()
вызывается без аргументов, элементы массива располагаются в алфавитном порядке, то есть по умолчанию элементы сортируются как строки. Методsort()
вызывает функциюString()
для каждого элемента, а затем сравнивает строки, даже если массив содержит только числа:let fruits = ["Банан", "Яблоко", "Мандарин"]; fruits.sort(); alert(fruits); // выведет Банан, Мандарин, Яблоко let numbers = [15, 50, 3]; numbers.sort(); alert(numbers); // выведет 15, 3, 50 (метод сравнил числа как строки // и вывел по возрастанию: "15", "3", "50")
Во многих случаях требуется совсем не это, поэтому в метод
sort()
можно передать функцию сравнения, которая упорядочивает два значения.Неопределенные элементы при сортировке всегда оказываются в конце массива. Это происходит, даже если указана специальная функция сортировки: такие значения никогда не передаются в заданную функцию.
Функция сравнения должна принимать два аргумента — a и b, и возвращать одно из следующих значений:
- Отрицательное число, если значение a «меньше» значения b и должно находиться в отсортированном массиве перед b.
- Ноль, если a и b эквивалентны.
- Положительное число, если значение a «больше» значения b.
Сортировка чисел в порядке возрастания:
let numbers = [15, 50, 3, 30, 1, 150]; numbers.sort(function(a, b) { return a - b; }); alert(numbers); // выведет 1, 3, 15, 30, 50, 150
Сортировка чисел в порядке убывания и получение максимального значения:
let numbers = [15, 50, 3, 30, 1, 150]; numbers.sort(function(a, b) { return b - a; }); alert(numbers[0]); // выведет 150, потому что первый элемент массива // теперь число с максимальным значением
Практика
Дан пустой массив, куда нужно добавить числа и применить метод
sort()
, чтобы отсортировать числа по возрастанию, вывести отсортированный массив и наименьшее число:array.sort(function(a, b) { return a - b; }); let min = array[0];let array =
[];Исходный массив:
Отсортированный массив:
Наименьшее число:
-
reverse
chevron_rightИзменяет порядок следования элементов в массиве на обратный.
Синтаксис:array.reverse(); // не принимает аргументов
Метод
reverse()
не создаёт новый массив, а изменяет текущий. Это означает, что возвращаемое значение — это только ссылка на исходный массив:const fruits = ["Банан", "Яблоко", "Мандарин"]; const result = fruits.reverse(); alert(result); // Мандарин, Яблоко, Банан alert(fruits); // тоже Мандарин, Яблоко, Банан alert(result === fruits); // true, так как result — это ссылка на исходный массив fruits
Если у массива есть «дырки» между элементами, то
reverse()
развернёт массив с учётом этих «дырок». Метод создает элементы в массиве, которые заполняют пробелы в нем. Каждый из этих созданных элементов имеет значениеundefined
:let fruits = ["Банан", "Яблоко", "Мандарин"]; fruits[5] = "Манго"; // добавим значение "Манго" под индексом 5 alert(fruits); // получился массив с "дыркой" - Банан, Яблоко, Мандарин, , , Манго alert(fruits[3]); // undefined, так как элемента нет fruits.reverse(); alert(fruits); // метод развернул массив с учетом "дырок" - Манго, , , Мандарин, Яблоко, Банан
Практика
Дан пустой массив, куда нужно добавить элементы и применить метод
reverse()
:array.reverse();let array =
[];Исходный массив:
Преобразованный массив:
Поиск элементов
-
includes
chevron_rightОпределяет, содержит ли массив определённый элемент.
Возвращает значениеtrue
илиfalse
. Такой же метод есть и у строк.array.includes(searchElement, fromIndex);
fromIndex
— необязательный параметр. Это индекс в массиве, с которого нужно начинать поиск элементаsearchElement
. Если атрибут не указан, то поиск осуществляется с 0 индекса.Проверим, есть ли искомый элемент в массиве. Поиск идёт с учётом регистра:
const fruits = ["Банан", "Яблоко", "Мандарин"]; const banana = fruits.includes("Банан"); alert(banana); // true const bananaSmall = fruits.includes("банан"); alert(bananaSmall); // false, потому что учитывается регистр const orange = fruits.includes("Апельсин"); alert(orange); // false
Практика
Дан пустой массив, куда нужно добавить элементы, после чего указать искомый элемент и применить метод
includes()
:const array =
[];const element = array.includes();Исходный массив:
Результат:
-
indexOf
chevron_rightПоиск элемента с начала массива.
Возвращает первый индекс искомого элемента.array.indexOf(searchElement, fromIndex);
fromIndex
— необязательный параметр. Это индекс в массиве, с которого нужно начинать поиск элементаsearchElement
. Если атрибут не указан, то поиск осуществляется с 0 индекса. Значение параметра может быть отрицательным, в этом случае поиск производится, начиная с индексаarray.length + fromIndex
по возрастанию.Если элемент один, то метод возвращает индекс этого элемента. Если элементов много — возвращает индекс первого подходящего элемента. Если элемента в массиве нет — вернёт
-1
:const fruits = ["Банан", "Яблоко", "Мандарин", "Груша", "Мандарин"]; alert(fruits.indexOf("Мандарин")); // выведет 2 — индекс первого элемента со значением "Мандарин" с начала массива alert(fruits.indexOf("Манго")); // выведет -1: такого элемента нет
Практика
Дан пустой массив, куда нужно добавить элементы, после чего указать искомый элемент и применить метод
indexOf()
:const array =
[];const element = array.indexOf();Исходный массив:
Результат:
-
lastIndexOf
chevron_rightПоиск элемента с конца массива.
Возвращает последний индекс искомого элемента.array.lastIndexOf(searchElement, fromIndex);
fromIndex
— необязательный параметр. Это индекс в массиве, с которого нужно начинать поиск элементаsearchElement
. Поиск осуществляется в порядке убывания индекса. Если атрибут не указан, то поиск осуществляется с последнего индекса в массиве. Значение параметра может быть отрицательным, в этом случае поиск производится, начиная с индексаarray.length + fromIndex
.Если элемент один, то метод возвращает индекс этого элемента. Если элементов много — возвращает последний индекс искомого элемента в массиве при первом совпадении. Если элемента в массиве нет — вернёт
-1
:const fruits = ["Банан", "Яблоко", "Мандарин", "Груша", "Мандарин"]; alert(fruits.lastIndexOf("Мандарин")); // выведет 4 - индекс первого элемента со значением "Мандарин" // с конца массива (последний индекс элемента) alert(fruits.lastIndexOf("Манго")); // выведет -1
Практика
Дан пустой массив, куда нужно добавить элементы, после чего указать искомый элемент и применить метод
lastIndexOf()
:const array =
[];const element = array.lastIndexOf();Исходный массив:
Результат:
Методы, возвращающие Array Iterator
-
entries
chevron_rightВозвращает итератор, который содержит пары ключ/значение по каждому индексу в массиве.
Синтаксис:array.entries();
Чтобы понять суть этого метода, нужно знать, что такое итератор.
Итератор — это объект, который отслеживает свою текущую позицию, одновременно получая элементы в коллекции по одному.
-
Итератор возвращает объект с двумя свойствами:
done
иvalue
. -
Итератор предоставляет метод
next()
, который возвращает следующий элемент в последовательности. -
Когда последовательность завершится, значение
value
будет равноundefined
, аdone
будет равнымtrue
.
entries()
возвращает новый объектArray Iterator
, который содержит пары ключей и значений для каждого индекса массива:const fruits = ["Банан", "Яблоко", "Мандарин"]; const entries = fruits.entries(); alert(entries.next().value); // 0, "Банан" alert(entries.next().value); // 1, "Яблоко" alert(entries.next().value); // 2, "Мандарин"
Чтобы получить пары ключ-значение, оптимально использование цикла
for of
:const fruits = ["Банан", "Яблоко", "Мандарин"]; const entries = fruits.entries(); for (let element of entries) { alert(element); } // проходим циклом по объекту // и выводим пары ключ-значение
Практика
Дан пустой массив, куда нужно добавить элементы и применить метод
entries()
:let entries = array.entries(); for (let element of entries) { console.log(element); }let array =
[];Исходный массив:
Результат:
-
Итератор возвращает объект с двумя свойствами:
-
keys
chevron_rightВозвращает итератор, который содержит ключи каждого индекса в массиве.
Синтаксис:array.keys();
Чтобы понять суть этого метода, нужно знать, что такое итератор.
Итератор — это объект, который отслеживает свою текущую позицию, одновременно получая элементы в коллекции по одному.
-
Итератор возвращает объект с двумя свойствами:
done
иvalue
. -
Итератор предоставляет метод
next()
, который возвращает следующий элемент в последовательности. -
Когда последовательность завершится, значение
value
будет равноundefined
, аdone
будет равнымtrue
.
Метод
keys()
возвращает новый объектArray Iterator
, который содержит ключи для каждого элемента в массиве и может быть расширен с помощью методаnext()
:const fruits = ["Банан", "Яблоко", "Мандарин"]; const keys = fruits.keys(); alert(keys.next().value); // 0 alert(keys.next().value); // 1 alert(keys.next().value); // 2 alert(keys.next().value); // undefined
Чтобы получить ключи, оптимально использовать цикл
for of
:const fruits = ["Банан", "Яблоко", "Мандарин"]; const keys = fruits.keys(); for (let key of keys) { alert(key); } // проходим циклом по объекту // и выводим ключи по порядку
Практика
Дан пустой массив, куда нужно добавить элементы и применить метод
keys()
:let keys = array.keys(); for (let key of keys) { console.log(key); }let array =
[];Исходный массив:
Результат:
-
Итератор возвращает объект с двумя свойствами:
-
values
chevron_rightВозвращает итератор, который содержит значение для каждого индекса в массиве.
Синтаксис:array.values();
Чтобы понять суть этого метода, нужно знать, что такое итератор.
Итератор — это объект, который отслеживает свою текущую позицию, одновременно получая элементы в коллекции по одному.
- Итератор возвращает объект с двумя свойствами: done и value.
- Итератор предоставляет метод next(), который возвращает следующий элемент в последовательности.
- Когда последовательность завершится, значение value будет равно undefined, а done будет равным true.
Пример использования values() с помощью метода next():
const fruits = ["Банан", "Яблоко", "Мандарин"]; const values = fruits.values(); alert(values.next().value); // Банан alert(values.next().value); // Яблоко alert(values.next().value); // Мандарин alert(values.next().value); // undefined
Чтобы получить значение каждого индекса, оптимально использовать цикл for of:
const fruits = ["Банан", "Яблоко", "Мандарин"]; const values = fruits.values(); for (let value of values) { alert(value); } // проходим циклом по объекту // и выводим значения индексов по порядку
Практика
Дан пустой массив, куда нужно добавить элементы и применить метод values():
let values = array.values(); for (let value of values) { console.log(values); }let array =
[];Исходный массив:
Результат:
Прочие методы
-
flat
chevron_rightУменьшает вложенность массива на заданное количество уровней.
Методflat()
возвращает новый массив.array.flat(depth);
Метод принимает необязательный аргумент
depth
— количество уровней, на которые нужно уменьшить вложенность. Значение по умолчанию —1
; если вложенность неизвестна, но нужно получить плоский массив, то можно передать аргументInfinity
.Если массив содержит другие массивы в качестве своих элементов, то метод
flat()
позволяет уменьшить вложенность, вплоть до полного превращения массива в плоский:const fruits = [ 'Банан', 'Яблоко', [ 'Мандарин', 'Апельсин', [ 'Груша', 'Манго' ] ] ] // у массива fruits внутри 2 уровня вложенности alert(fruits.flat()); // выведет Банан, Яблоко, Мандарин, Апельсин, Груша, Манго console.log(fruits.flat()); // но в консоли будет отображаться массив // ['Банан', 'Яблоко', 'Мандарин', 'Апельсин', ['Груша', 'Манго']] // остался один уровень вложенности ['Груша', 'Манго'] console.log(fruits.flat(2)); // а сейчас в консоли будет отображаться массив // ['Банан', 'Яблоко', 'Мандарин', 'Апельсин', 'Груша', 'Манго'] // массив стал плоским console.log(fruits.flat(Infinity)); // массив также стал плоским
-
copyWithin
chevron_rightКопирует часть массива в тот же массив.
Метод возвращает массив без изменения размера, т.е. копирует элементы массива в пределах одного массива.array.copyWithin(target, start, end);
target
— начальный индекс позиции цели, куда копировать элементы.start
— начальный индекс массива, откуда начинать копировать элементы.end
(необязательный параметр) — конечный индекс массива, которым заканчивается копирование элементов массива. Если параметр не указан, то будут скопированы все элементы отstart
и до конца массива.При отрицательных значениях индекс, с которого (или до которого) будет произведено копирование, рассчитывается по формуле:
length + target
(илиstart
, илиend
).Метод копирует элементы массива внутри него в позицию, начинающуюся по индексу
target
. Копия берется по индексам, задаваемымstart
иend
:let fruits = ["Банан", "Яблоко", "Мандарин", "Груша", "Манго"]; alert(fruits.copyWithin(3, 0)); // Банан, Яблоко, Мандарин, Банан, Яблоко
Как сработал метод?
Под индексом 3 находится элемент "Груша" — это
target
.Индекс 0 - элемент "Банан" — это
start
.Параметр
end
не задан, значит, будут скопированы элементы, начиная соstart
до конца массива.Метод нашёл индекс 3 и скопировал в него элемент из индекса 0, далее нашёл индекс 4 и скопировал в него элемент из индекса 1. После этого метод завершил работу, так как дошел до конца массива.
Рассмотрим пример с необязательным параметром
end
:let fruits = ["Банан", "Яблоко", "Мандарин", "Груша", "Манго"]; alert(fruits.copyWithin(-3, 0, -1)); // Банан, Яблоко, Банан, Яблоко, Мандарин
Как сработал метод в этом примере?
target
: -3. Значит, цель — индекс 2 со значением "Мандарин".start
: индекс 0 со значением "Банан".end
: -1. Значит, конечная точка — индекс 4 со значением "Манго".Метод помещает последовательность "Банан", "Яблоко", "Мандарин", "Груша", "Манго" в исходный массив, начиная с индекса 2 (значение "Мандарин") и заканчивая индексом 4. Поскольку метод
copyWithin()
не изменяет длину массива, в итоге мы получим массив["Банан", "Яблоко", "Банан", "Яблоко", "Мандарин"]
.Для наглядности заменим значения на цифры — вместо
["Банан", "Яблоко", "Мандарин", "Груша", "Манго"]
возьмём массив[1, 2, 3, 4, 5]
. В итоге с помощью методаcopyWithin()
получится массив[1, 2, 1, 2, 3]
.[1, 2, 3, 4, 5] исходный массив 0 1 2 3 4 индексы с начала масcива -5 -4 -3 -2 -1 индексы с конца масcива ^ ^ ^ параметры метода | | *-------- end | *-------------- target *-------------------- start [1, 2, 3, 4, 5] исходный массив [ 1, 2, 3, 4, 5] копируемые значения [1, 2, 1, 2, 3] результат (массив сохраняет длину)
-
fill
chevron_rightЗаполняет массив указанным значением.
Синтаксис:array.fill(value, start, end);
Параметры:
-
value
— значение, которым будет заполнен массив; -
start
(необязательный параметр) — индекс элемента, с которого начинается заполнение массива (по умолчанию — 0); допускается использование отрицательных значений, в этом случае индекс рассчитывается по формулеarray.length + start
; -
end
(необязательный параметр) — индекс элемента, на котором заканчивается заполнение массива (по умолчанию —array.length
); допускается использование отрицательных значений, в этом случае индекс рассчитывается по формулеarray.length + end
;
Метод заполняет все элементы массива от начального до конечного индексов одним значением и изменяет существующий массив, а не возвращает новый:
const fruits = ["Банан", "Яблоко", "Мандарин", "Груша"]; alert(fruits.fill("Манго", 2, 4)); // заполнить массив значением "Манго" со 2 по 4 индекс // выведет Банан, Яблоко, Манго, Манго alert(fruits.fill("Манго", 1)); // заполнить массив значением "Манго" с 1 индекса // выведет Банан, Манго, Манго, Манго alert(fruits.fill("Манго")); // заполнить весь массив значением "Манго" // выведет Манго, Манго, Манго, Манго
-
-
toLocaleString
chevron_rightОбъединяет все элементы массива в одно строковое значение.
Синтаксис:array.toLocaleString();
Элементы массива в зависимости от их типа преобразуются в строки с использованием своих собственных методов
toLocaleString()
:-
Object:
Object.prototype.toLocaleString()
; -
Number:
Number.prototype.toLocaleString()
; -
Date:
Date.prototype.toLocaleString()
;
Пример использования метода:
// создадим массив с разными типами элементов: const arr = [5, "Яблоко", new Date()]; alert(arr.toLocaleString()); // выведет значение переменной arr, преобразованной // с помощью метода в строку: // 5, Яблоко, XX.XX.XXXX, XX:XX:XX (актуальная дата и время)
-
Object:
Методы, принимающие callback function
Все методы этой категории принимают в качестве аргумента функцию обратного вызова — callback function
. Эта функция выполняется последовательно и не более одного
раза для каждого элемента в массиве.
array.method(callback, thisArg);
callback
принимает следующие основные параметры:
-
element
— элемент массива в текущей итерации; -
index
— индекс текущего элемента; -
arr
— сам массив, который мы перебираем.
У некоторых методов есть и дополнительные параметры колбэка.
То, что должен вернуть колбэк, зависит от метода массива, который был вызван.
Функция callback
вызывается только для индексов массива, имеющих
присвоенные значения (включая undefined
); она не вызывается для индексов,
которые были удалены или которым значения никогда не присваивались. Элементы массива, не прошедшие проверку
функцией callback
, просто пропускаются и не включаются в новый массив.
Кроме того, такие методы могут принимать необязательный параметр thisArg
. Это объект, на который может ссылаться ключевое слово this
в функции callback
. Если аргумент
thisArg
не указан, в качестве значения this
используется undefined
. Аргумент
thisArg
не имеет значения для любого колбэка, определенного с помощью
стрелочной функции, поскольку стрелочные функции не имеют собственной привязки this
.
Перебор и преобразование массивов
-
forEach
chevron_rightПрименяет колбэк-функцию ко всем элементам массива. Можно использовать вместо классического цикла
for
.Синтаксис:array.forEach(callback(element, index, arr), thisArg);
Метод позволяет удобно получать элемент в текущей итерации, без необходимости всякий раз обращаться к массиву по индексу. В
forEach()
не будут работать return,break
иcontinue
:const fruits = ["Банан", "Яблоко", "Мандарин"]; fruits.forEach((element, index, arr) => { alert('Элемент: ' + element); alert('Его индекс: ' + index); alert('Массив: ' + arr); // выведет последовательно: // Элемент: Банан => Его индекс: 0 => Массив: Банан, Яблоко, Мандарин // Элемент: Яблоко => Его индекс: 1 => Массив: Банан, Яблоко, Мандарин // Элемент: Мандарин => Его индекс: 2 => Массив: Банан, Яблоко, Мандарин })
Практика
Дан пустой массив, куда нужно добавить числа и применить метод
forEach()
для вычисления квадрата:let arraySquare = []; array.forEach(function (num) { let square = num * num; arraySquare.push(square); })let array =
[];Исходный массив:
Новый массив:
-
map
chevron_rightСоздает новый массив с результатом вызова функции-колбэка для каждого элемента массива.
Переданная функция будет вызвана для каждого элемента по порядку.array.map(callback(element, index, arr), thisArg);
Возвращает новый массив, при этом исходный массив никак не изменится:
const array = [1, 2, 3, 4, 5]; // исходный массив const squares = array.map(function (num) { return num * num; }) alert(squares); // выведет новый массив: 1, 4, 9, 16, 25 alert(array); // исходный массив не изменился: 1, 2, 3, 4, 5
Разберем тот же пример через классический цикл
for
:const array = [1, 2, 3, 4, 5]; // исходный массив const squares = []; for (let i = 0; i < array.length; i++) { const num = array[i]; const numSquare = num * num; squares.push(numSquare); } alert(squares); // выведет новый массив: 1, 4, 9, 16, 25
Практика
Дан пустой массив, куда нужно добавить числа и применить метод
map()
, чтобы прибавить к каждому числу единицу:let arrayPlusOne = array.map(function (num) { return num + 1; })let array =
[];Исходный массив:
Новый массив:
-
reduce
chevron_rightИспользуется для вычисления на основе массива какого-либо единого значения. Применяет функцию к аккумулятору и каждому значению массива слева-направо.
Функция-колбэк будет вызвана для каждого элемента массива, и всегда должна возвращать результат.reduce()
не выполняет функцию для элементов массива без значений.array.reduce(callback(accumulator, element, index, array), initialValue);
Сама функция-колбэк в методе
reduce()
может принимать четыре параметра:-
accumulator
— текущее значение аккумулятора; -
element
— элемент массива в текущей итерации; -
index
— индекс текущего элемента; -
array
— сам массив, который мы перебираем.
initialValue
— необязательный параметр. Если значениеinitialValue
предоставляется, тоaccumulator
является значениемinitialValue
при первом вызове функции, а значениеelement
будет равным первому значению в массиве. Если аргументinitialValue
не задан, то значениеaccumulator
будет равным первому значению в массиве, а значениеelement
будет равным второму значению в массиве.Чтобы разобрать работу метода со всеми аргументами, вычислим сумму всех элементов массива, а после определим среднее арифметическое:
const array = [1, 2, 3, 4, 5]; // исходный массив // создадим функцию-колбэк, которая суммирует числа // и вычисляет среднее арифметическое: function findAverage(accumulator, element, index, array) { const sum = accumulator + element; // Если мы находимся на последнем элементе, // вычисляем среднее арифметическое делением // на количество элементов: if (index === array.length - 1) { return sum / array.length; } return sum; } // помещаем функцию-колбэк в метод reduce и задаем // начальное значение для аккумулятора (равное 0): const average = array.reduce(findAverage, 0); alert(average); // выведет среднее арифметическое элементов массива: 3
Запишем пример кода более лаконично:
const array = [1, 2, 3, 4, 5]; const average = array.reduce(function (accumulator, element, index, array) { const sum = accumulator + element; if (index === array.length - 1) { return sum / array.length; } return sum; }, 0);
Тот же пример, написанный через классический цикл
for
:const array = [1, 2, 3, 4, 5]; // исходный массив let sum = 0; for(let i = 0; i < array.length; i++){ sum = sum + array[i]; } let average = sum / array.length; alert(average); // также выведет среднее арифметическое элементов массива: 3
Практика
Дан пустой массив, куда нужно добавить числа и применить метод
reduce()
, чтобы вычислить сумму всех элементов массива:const sum = numbers.reduce(function (accumulator, element) { return accumulator + element; }, 0)const numbers =
[];Исходный массив:
Результат:
-
-
reduceRight
chevron_rightРаботает точно так же, как и
reduce()
, но применяет функцию к аккумулятору и каждому значению массива справа налево, сводя его к одному значению.reduceRight()
не выполняет функцию для элементов массива без значений.array.reduceRight(callback(accumulator, element, index, array), initialValue);
Сама функция-колбэк в методе
reduceRight()
может принимать четыре параметра:-
accumulator
— текущее значение аккумулятора; -
element
— элемент массива в текущей итерации; -
index
— индекс текущего элемента; -
array
— сам массив, который мы перебираем.
initialValue
— необязательный параметр. Если значениеinitialValue
предоставляется, тоaccumulator
является значениемinitialValue
при первом вызове функции, а значениеelement
будет равным первому значению в массиве. Если аргументinitialValue
не задан, то значениеaccumulator
будет равным первому значению в массиве, а значениеelement
будет равным второму значению в массиве.Чтобы разобрать работу метода со всеми аргументами, вычислим сумму всех элементов массива, а после определим среднее арифметическое:
const array = [1, 2, 3, 4, 5]; // исходный массив // создадим функцию-колбэк, которая суммирует числа // и вычисляет среднее арифметическое: function findAverage(accumulator, element, index, array) { const sum = accumulator + element; // Если мы прошли весь цикл и находимся на первом элементе // (так как применяется метод reduceRight, перебор элементов // будет идти справа налево — от последнего к первому), // вычисляем среднее арифметическое делением // на количество элементов: if (index === 0) { return sum / array.length; } return sum; } // помещаем функцию-колбэк в метод reduceRigth и задаем // начальное значение для аккумулятора (равное 0): const average = array.reduceRight(findAverage, 0); alert(average); // выведет среднее арифметическое элементов массива: 3
Запишем пример кода более лаконично:
const array = [1, 2, 3, 4, 5]; const average = array.reduceRight(function (accumulator, element, index, array) { const sum = accumulator + element; if (index === 0) { return sum / array.length; } return sum; }, 0);
Тот же пример, написанный через классический цикл
for
:const array = [1, 2, 3, 4, 5]; // исходный массив let sum = 0; // проходимся циклом по массиву справа налево: for(let i = array.length - 1; i >= 0; i--){ sum = sum + array[i]; } let average = sum / array.length; alert(average); // также выведет среднее арифметическое элементов массива: 3
Практика
Дан пустой массив, куда нужно добавить числа и применить метод
reduceRight()
, чтобы вычесть числа справа налево, при этом массив должен быть отсортирован по возрастанию чисел, чтобы вычитание происходило из большего числа:numbers.sort(function(a, b) { return a - b; }); const subtraction = numbers.reduceRight(function (accumulator, element) { return accumulator - element; });const numbers =
[];Исходный массив:
Отсортированный массив:
Результат:
-
-
filter
chevron_rightФильтрует элементы с помощью переданной колбэк-функции.
Позволяет получить новый массив, при этом исходный массив никак не изменится. Колбэк-функция будет вызвана для каждого элемента массива и по результату функции примет решение: включать этот элемент в новый массив или нет.array.filter(callback(element, index, array), thisArg);
Функция должна возвращать
boolean
, т.е. результатом должен бытьtrue
илиfalse
. Такие функции называют предикатами.Рассмотрим пример, в котором нужно отфильтровать массив и вернуть новый только с нечетными числами:
const array = [1, 2, 3, 4, 5]; // исходный массив const arrayOdds = array.filter(function (num) { return num % 2 !== 0; }) alert(arrayOdds); // выведет новый массив с нечетными числами: 1, 3, 5
Тот же пример через классический цикл
for
:const array = [1, 2, 3, 4, 5]; // исходный массив const arrayOdds = []; for (let i = 0; i < array.length; i++) { if (array[i] % 2 !== 0) { arrayOdds.push(array[i]); }; } alert(arrayOdds); // также выведет новый массив: 1, 3, 5
Практика
Дан пустой массив, куда нужно добавить числа и применить метод
filter()
, чтобы найти все чётные числа:let arrayEven = array.filter(function (num) { return num % 2 == 0; })const array =
[];Исходный массив:
Отфильтрованный массив:
-
every
chevron_rightПрименяется, когда необходимо узнать, что все элементы в массиве соответствуют условию в колбэке.
Возвращает значениеtrue
, если функция будетtrue
для всех элементов массива; в противном случае возвращается значениеfalse
. Если массив не содержит элементов, методevery()
возвращает значениеtrue
.array.every(callback(element, index, array), thisArg);
Проверим, все ли числа в массиве больше или равны единице:
const array = [1, 2, 3, 4, 5]; const arrayNums = array.every(function (num) { return num >= 1; }) alert(arrayNums); // выведет true, потому что все числа в массиве больше 1
Пример через классический цил
for
:const array = [1, 2, 3, 4, 5]; const arrayNums = function (array) { for(let i = 0; i < array.length; i++){ if(array[i] >= 1){ return true; } } return false; } alert(arrayNums(array)); // также выведет true
Практика
Дан пустой массив, куда нужно добавить элементы и применить метод
every()
, чтобы узнать, все ли элементы одинаковые:const arrayElements = array.every(function (element) { return element === array[0]; })const array =
[];Исходный массив:
Результат:
-
some
chevron_rightПозволяет узнать, есть ли в массиве хотя бы один элемент, удовлетворяющий условию в функции-колбэке.
Колбэк-функция будет вызываться для каждого элемента массива до тех пор, пока не вернётсяtrue
, либо пока не закончатся элементы массива.array.some(callback(element, index, array), thisArg);
Проверим, есть ли в массиве хотя бы одно нечетное число:
const array = [1, 2, 3, 4, 5]; const arrayNums = array.some(function (num) { return num % 2 !== 0; }) alert(arrayNums); // выведет true, потому что в массиве есть нечетное число
Пример через классический цил
for
:const array = [1, 2, 3, 4, 5]; const arrayNums = function (array) { for(let i = 0; i < array.length; i++){ if(array[i] % 2 !== 0){ return true; } } return false; } alert(arrayNums(array)); // также выведет true
Практика
Дан пустой массив, куда нужно добавить числа и применить метод
some()
, чтобы узнать, есть ли в массиве хотя бы одно четное число:const arrayNums = array.some(function (num) { return num % 2 === 0; })const array =
[];Исходный массив:
Результат:
-
flatMap
chevron_rightПрименяется для трансформации исходных данных с уменьшением вложенности.
Метод идентичен последовательному вызовуmap().flat()
с параметромdepth = 1
. Был добавлен в стандарте ES2019. Если вы поддерживаете браузеры, выпущенные раньше 2018 года, то понадобится полифил.array.flatMap(callback(element, index, array), thisArg);
Для примера рассмотрим функцию, которая принимает значение и возвращает массив из двух элементов, каждый из которых дублирует значение:
const array = [1, 2, 3]; // исходный массив // напишем функцию, которая возвращает массив из элементов // и дублирует их: const duplicate = function (element) { return [element, element]; }
Если применить функцию к массиву, получим вложенный массив:
const array = [1, 2, 3]; const duplicate = function (element) { return [element, element]; } // применим функцию к массиву, трансформируя его с помощью map: alert(array.map(duplicate)); console.log(array.map(duplicate)); // выведет вложенный массив [[1, 1], [2, 2], [3, 3]]
Извлечь вложенные массивы можно с помощью
flat
:const array = [1, 2, 3]; const duplicate = function (element) { return [element, element]; } // добавляем метод flat к методу map: alert(array.map(duplicate).flat()); console.log(array.map(duplicate).flat()); // выведет готовый результат — [1, 1, 2, 2, 3, 3]
В функциональном программировании такие действия с массивами встречаются часто. Поэтому появился метод
flatMap()
, который упрощает код. Данный метод более эффективный, чем вызовmap().flat()
по отдельности, поскольку обход массива совершается только один раз:const array = [1, 2, 3]; const duplicate = function (element) { return [element, element]; } alert(array.flatMap(duplicate)); console.log(array.flatMap(duplicate)); // выведет готовый результат — [1, 1, 2, 2, 3, 3]
Практика
Дан пустой массив, куда нужно добавить числа и применить метод
flatMap()
, чтобы сформировать на основе исходного массива новый массив из элементов и их квадратов:const duplicateSquare = array.flatMap(function (element) { return [element, element**2]; });const array =
[];Исходный массив:
Новый массив:
Поиск элементов
-
find
chevron_rightВозвращает первый найденный в массиве элемент, который подходит под условие в переданной функции.
Если в массиве не найдётся ни одного подходящего элемента, то вернётся значениеundefined
.array.find(callback(element, index, array), thisArg);
Функция должна возвращать булевое значение
true
илиfalse
.find()
вернёт первый элемент, на котором переданная функция-колбэк вернулаtrue
. Попробуем найти число в массиве:const array = [1, 2, 3, 4, 5]; // исходный массив const arrayFind = array.find(function (element) { return element === 2; }); // колбэк вернул true, потому что в массиве есть число 2 alert(arrayFind); // выведет значение найденного элемента: 2
Этот же пример, написанный с помощью классического цикла
for
:const array = [1, 2, 3, 4, 5]; // исходный массив const arrayFind = (array) => { for (let i = 0; i < array.length; i++) { if (array[i] === 2) { return array[i]; } } return undefined; }; alert(arrayFind(array)); // также выведет значение: 2
Практика
Дан пустой массив, куда нужно добавить числа и применить метод
find()
, чтобы узнать, есть ли там число 5:const arrayFind = array.find(function (element) { return element === 5; });const array =
[];Исходный массив:
Результат:
-
findIndex
chevron_rightВозвращает индекс первого найденного в массиве элемента, который подходит под условие переданной функции.
Если ни одного подходящего элемента не найдётся, то метод вернёт-1
.array.findIndex(callback(element, index, array), thisArg);
Для примера возьмём два массива: в одном будут разные числа, во втором — только чётные. И попробуем найти в каждом массиве нечетное число и вернуть его индекс:
const array = [1, 2, 3, 4, 5]; const arrayEven = [2, 4, 6]; // исходные массивы // напишем функцию, которая будет искать нечетные числа: function isOdd(element) { return element % 2 !== 0; } // применим метод find(), куда поместим функцию isOdd: alert(array.findIndex(isOdd)); // выведет 0 — это индекс первого нечетного числа в массиве alert(arrayEven.findIndex(isOdd)); // выведет -1, потому что в этом массиве нет нечетных чисел
Тот же пример через классический цикл
for
:const array = [1, 2, 3, 4, 5]; const arrayEven = [2, 4, 6]; // исходные массивы // напишем функцию-предикат, // которая вернет true или false: function isOdd(element) { return element % 2 !== 0 } // напишем функцию, которая будет принимать 2 аргумента: // массив и функцию-предикат: function findIndex(array, predicate) { for (let i = 0; i < array.length; i++) { // Если элемент удовлетворяет условию, // то возвращаем его индекс if (predicate(array[i])) { return i; } } return -1 } // подставим в функцию findIndex наши аргументы - // массивы array и arrayEven, а также функцию isOdd alert(findIndex(array, isOdd)); // выведет 0 — это индекс первого нечетного числа в массиве alert(findIndex(arrayEven, isOdd)); // выведет -1, потому что в этом массиве нет нечетных чисел
Практика
Дан пустой массив, куда нужно добавить числа и применить метод
findIndex()
, чтобы узнать, есть ли в массиве четное число, и в случае успеха, вернуть его индекс:const arrayFindEven = array.findIndex(function (element) { return element % 2 === 0; });const array =
[];Исходный массив:
Результат:
-
findLast
chevron_rightВозвращает первый найденный с конца массива элемент, который подходит под условие в переданной функции.
Выполняет итерацию массива в обратном порядке и возвращает первое значение элемента, которое удовлетворяет условию заданной функции проверки. Если в массиве не найдётся ни одного подходящего элемента, то вернётся значениеundefined
.array.findLast(callback(element, index, array), thisArg);
Функция должна возвращать булевое значение
true
илиfalse
.findLast()
вернёт первый элемент с конца массива, на котором переданная функция-колбэк вернулаtrue
. Попробуем найти наибольшее четное число:const array = [1, 2, 3, 4, 5]; // исходный массив const arrayEven = array.findLast(function (element) { return element % 2 === 0; }); // колбэк вернул true, потому что в массиве есть четные числа alert(arrayEven); // выведет значение найденного элемента: 4
Этот же пример, написанный с помощью классического цикла
for
:const array = [1, 2, 3, 4, 5]; // исходный массив const arrayEven = (array) => { let even = []; for (let i = 0; i < array.length; i++) { if (array[i] % 2 === 0) { even.push(array[i]); } } if(even.length !== 0) { even.sort(function(a, b) { return b - a; }); return even[0]; } return undefined; }; alert(arrayEven(array)); // также выведет значение: 4
Практика
Дан пустой массив, куда нужно добавить числа и применить метод
findLast()
, чтобы узнать, есть ли там нечетные числа, и вернуть наибольшее:const arrayOdd = array.findLast(function (element) { return element % 2 !== 0; });const array =
[];Исходный массив:
Результат:
-
findLastIndex
chevron_rightВозвращает индекс первого найденного с конца массива элемента, который подходит под условие переданной функции.
Выполняет итерацию массива в обратном порядке и возвращает индекс первого элемента, удовлетворяющего заданной функции-колбэку. Если ни один элемент не удовлетворяет условию функции, возвращается-1
.array.findLastIndex(callback(element, index, array), thisArg);
Для примера возьмём два массива: в одном будут разные числа, во втором — только чётные. И попробуем найти в каждом массиве нечетные числа и вернуть индекс последнего:
const array = [1, 2, 3, 4, 5]; const arrayEven = [2, 4, 6]; // исходные массивы // напишем функцию, которая будет искать нечётные числа: function isOdd(element) { return element % 2 !== 0; } // применим метод findLastIndex(), куда поместим функцию isOdd: alert(array.findLastIndex(isOdd)); // выведет 4 — это индекс последнего нечётного числа в массиве alert(arrayEven.findLastIndex(isOdd)); // выведет -1, потому что в этом массиве нет нечётных чисел
Тот же пример через классический цикл
for
:const array = [1, 2, 3, 4, 5]; const arrayEven = [2, 4, 6]; // исходные массивы // напишем функцию-предикат, // которая вернет true или false: function isOdd(element) { return element % 2 !== 0 } // напишем функцию, которая будет принимать 2 аргумента: // массив и функцию-предикат: function findLastIndex(array, predicate) { let odd = []; for (let i = 0; i < array.length; i++) { if (predicate(array[i])) { odd.push(i); } } if(odd.length !== 0) { odd.sort(function(a, b) { return b - a; }); return odd[0]; } return -1 } // подставим в функцию findLastIndex наши аргументы - // массивы array и arrayEven, а также функцию isOdd alert(findIndex(array, isOdd)); // выведет 4 — это индекс последнего нечетного числа в массиве alert(findIndex(arrayEven, isOdd)); // выведет -1, потому что в этом массиве нет нечётных чисел
Практика
Дан пустой массив, куда нужно добавить числа и применить метод
findLastIndex()
, чтобы узнать, есть ли в массиве чётные числа, и в случае успеха, вернуть индекс последнего:const arrayFindEven = array.findLastIndex(function (element) { return element % 2 === 0; });const array =
[];Исходный массив:
Результат: