Массивы — чрезвычайно полезны для структурированного хранения и передачи большого количества данных. Однако для удобной работы с такой громоздкой конструкцией требуются специальные методы. Рассмотрим некоторые из них.

Создание массива

const a = []
const a = [1, 2, 3]
const a = Array.of(1, 2, 3)
const a = Array(6).fill(1) // массив из шести единиц

Размер массива

arr.length

Проверка на наличие элемента

array.includes(element)

Метод Array.prototype.includes ищет в массиве array элемент element и возвращает true или false.

Поиск регистрозависимый, ищет точное соответствие, а не вхождение подстроки.

Можно указать начальную точку для поиска (передается вторым аргументом).

array.includes(element, 2)

Также может быть применен к строкам.

Поиск элемента

Поиск с начала массива

array.indexOf(element)

Метод Array.prototype.indexOf возвращает позицию (индекс) элемента в массиве. Если в данном массиве такого элемента нет, вернет -1. Если в массиве несколько элементов с таким значением, вернет индекс первого найденного.

Можно указать начальную точку для поиска, как в предыдущем методе.

array.indexOf(element, 2)

Поиск с конца массива

array.lastIndexOf(element)

Метод Array.prototype.lastIndexOf делает то же самое, но поиск начинает с конца массива. Таким образом, если в массиве несколько одинаковых элементов, будет возвращен последний из них.

Array.prototype.find и Array.prototype.findIndex

arr.find((element, index, array) => { // return true or false })
arr.findIndex((element, index, array) => { // return true or false })

Метод Array.prototype.find возвращает первый соответствующий элемент или undefined.

Метод Array.prototype.findIndex возвращает индекс первого соответствующего элемента или -1.

Добавить и удалить элементы

В конце массива

array.pop()

Метод Array.prototype.pop удаляет последний элемент и возвращает его.

array.push(element)

Метод Array.prototype.push добавляет новый элемент в конец, возвращает измененный массив.

Аналогичный код:

array[array.length] = element

В начале массива

array.shift()

Метод Array.prototype.shift удаляет первый элемент и возвращает его.

array.unshift(element)

Метод Array.prototype.unshift добавляет новый элемент в начало массива, возвращает измененный массив.

Обнуление длины

arr.length = 0;

Удаляет все элементы массива.

Удаление одного элемента

delete arr[index]

Удаляет элемент по указанному индексу, при этом оставляет «дырку» — пустой элемент.

Array.prototype.splice

arr.splice(index[, deleteCount, elem1, ..., elemN])

Метод Array.prototype.splice yдаляет deleteCount элементов, начиная с номера index, а затем вставляет elem1, ..., elemN на их место. Возвращает массив из удалённых элементов.

Array.prototype.concat

arr.concat(value1, value2, … valueN)
arr.concat(arr2)

Метод Array.prototype.concat создает новый массив, равный arr и добавляет указанные в скобках элементы.

Перебор

Циклы

В массивах перебор элементов осуществляется обычным циклом for или циклом for-of:

for (let i=0; i<arr.length; i++) {
  // ...
}

for (let v of arr) { 
  // ... 
}

forEach

Можно также вызвать функцию для каждого элемента массива с помощью метода Array.prototype.forEach:

arr.forEach(callback(item, i, arr)[, this])

В функцию передаются — элемент массива, его номер и сам массив.

Вторым аргументом forEach может принимать контекст вызова функции callback.

Соответствие условию

arr.every(callback(item, i, arr)[, this])

Метод Array.prototype.every возвращает true, если вызов callback вернёт true для каждого элемента arr.

arr.some(callback(item, i, arr)[, this])

Метод Array.prototype.some возвращает true, если вызов callback вернёт true хотя бы для одного элемента arr.

Из массива в строку и обратно

split

let string = 'some interesting text';
let arr = string.split(' ');

Первый аргумент метода String.prototype.split — разделитель (если пустая строка, разобьет по буквам). Второй аргумент — ограничение на количество элементов в массиве.

join

let arr = ['some', 'interesting', 'text'];
let string = arr.join(' ');

new Array(4).join("ля") // повторит разделитель ля 4 раза, массив будет пустым

Метод Array.prototype.join соединяет элементы массива в строку через указанный разделитель.

Копирование

slice

arr.slice(begin, end)

Копирует участок массива от begin до end (не включая). Исходный массив при этом не меняется.

  • если не указан end — копирует до конца массива
  • если start отрицательный — считает с конца
  • без аргументов — скопирует весь массив

Метод slice() одинаков для массивов (Array.prototype.slice) и строк (String.prototype.slice).

Spread-оператор

arr1 = [...arr2]
const b = Array.of(...a)

Spread-синтаксис — способ копировать массив без копирования ссылки на него.

Array.from

const b = Array.from(a)
const b = Array.from(a, x => x % 2 == 0)

Метод Array.from также копирует массив без копирования ссылки на него. Может принимать функцию фильтрации.

Array.prototype.copyWithin

arr.copyWithin(target, start[, end = this.length])

Метод Array.prototype.copyWithin копирует часть массива внутри него в указанную позицию target.

const a = [1, 2, 3, 4]
a.copyWithin(0, 2) // [3, 4, 3, 4]
const b = [1, 2, 3, 4, 5]
b.copyWithin(0, 2) // [3, 4, 5, 4, 5]
const c = [1, 2, 3, 4, 5]
c.copyWithin(0, 2, 4) // [3, 4, 3, 4, 5]

Объединение массивов

let arr1 = [...arr2, ...arr3]

Spread-синтаксис может объединить элементы массивов arr2 и arr3 в массиве arr1.

Сортировка, фильтрация, изменение

Array.prototype.sort

arr.sort(function)

Метод Array.prototype.sort принимает функцию для сортировки. Функция попарно сравнивает между собой элементы массива и возвращает значение, на основании которого массив сортируется:

  • Положительное, если a > b,
  • Отрицательное, если a < b,
  • Если a = b, можно вернуть 0, но в целом это не важно.

Array.prototype.reverse

arr.reverse()

Метод Array.prototype.reverse переворачивает массив.

Array.prototype.filter

arr.filter(callback(item, i, arr)[, this]);

// пример фильтрующей функции
function(number, index, arr) {
  return number > 0;  //возвращает только элементы с положительным значением
}

Метод Array.prototype.filter фильтрует массив с помощью функции фильтрации.

Array.prototype.map

arr.map(callback(item, i, arr)[, this])

// пример трансформирующей функции
function(item, index, arr) {
  return item.length; // вместо строк выводит их длины
}

Метод Array.prototype.map трансформирует каждый элемент массива.

Array.prototype.reduce

arr.reduce(callback(previousValue, currentItem, index, arr)[, this])
arr.reduceRight(callback(previousValue, currentItem, index, arr)[, this])

Метод Array.prototype.reduce последовательно обрабатывает каждый элемент массива функцией callback с сохранением промежуточного результата.

Массивы и объекты

Есть коллекция строк, необходимо проверить, есть ли в ней указанный элемент.
Свойство массива indexOf работает медленно, поэтому оно не подходит. Чтобы сделать это быстро, нужно превратить все элементы в ключи объекта, доступ к которым осуществляется гораздо быстрее.

var obj = {};
var arr = ["elem1", "elem2", "elem3"];
for (var i = 0; i < arr.length; i++) {
  var key = arr[i]; // для каждого элемента создаём свойство
  obj[key] = true; // значение здесь не важно
}

Обратная задача — все свойства объекта собрать в массив:

var obj = {
  prop1: value1,
  prop2: value2,
  prop3: value3,
  prop4: value4
}
var keys = Object.keys(obj); //keys - массив, содержащий свойства объекта obj

2 комментария

  • Нидаль
    Нидаль
    11/01/2022, 07:56
    Спасибо за статью? Только в начале вероятно опечатка, указан метод slice, в Примере splice, в описании он зовётся slice, но речь всё таки идёт о splice)
    • Furry_web
      Furry_web
      12/01/2022, 08:56
      Спасибо! Исправлено)

Оставить комментарий

*Доступные HTML-теги: a, abbr, blockquote, code, pre, del, i, em, strong, b, strike
*Не будет опубликован