Массив в JavaScript такой же, как и в любом другом языке программирования. Это наборы данных. В JavaScript они могут быть набором строк, чисел, объектов, массивов и функций. Они также могут быть смесью типов данных.
Как и любая другая структура данных в JavaScript, они имеют набор методов/функций, которые можно вызывать для получения, установки, управления, преобразования и удаления элементов в массиве или даже для слияния двух массивов.
Определение массива
Существует несколько способов определения массива:
Использование конструктора
Конструкторы используются для создания нового экземпляра объекта. Поэтому они используют ключевое слово «новое».
var arr = new Array();
Это создаст пустой массив. Вы можете создать массив с предопределенным набором данных, выполнив следующие действия:
var arr = new Array(1,2,3);
Стенография
Сокращенный метод не требует использования ключевого слова «новое» или вызываемого метода Array
. Вы просто определяете массив, используя квадратные скобки:
var arr = [];
Чтобы предварительно заполнить массив данными:
var arr = [1,2,3];
Добавление элементов в массив
Чтобы добавить элемент в конец массива, вы используете метод push
:
var arr = [1,2,3]; arr.push(4); // arr is now [1,2,3,4]
Чтобы добавить элемент в начало массива, мы используем unshift
var arr = [1,2,3]; arr.unshift(0); // arr is now [0,1,2,3]
Чтобы добавить элемент в определенную позицию в массиве, вы должны использовать splice
, который принимает 3 аргумента. Первый — это индекс, с которого следует начать изменение, второй — количество элементов для удаления (поскольку мы только вставляем, мы передадим 0), а третий — значение для вставки. (splice будет принимать столько аргументов, сколько вы передадите, значения после второго аргумента будут добавлены в массив в указанной позиции)
var arr = [1,2,4]; arr.splice(2,0,3); // arr is now [1,2,3,4]
Удаление элементов из массива
Чтобы удалить элемент с конца массива, используйте метод pop
:
var arr = [1,2,3,4]; arr.pop(); // arr is now [1,2,3]
Чтобы удалить элемент из начала массива, используйте метод shift
:
var arr = [0,1,2,3]; arr.shift(); // arr is now [1,2,3]
Чтобы удалить элемент из определенной позиции в массиве, используйте splice
var arr = [1,2,3,3,4]; arr.splice(2,1); // arr is now [1,2,3,4];
Объединение массивов
Чтобы объединить массив, мы используем метод concat:
var arr1 = [1,2,3], arr2 = [4,5,6]; arr = arr1.concat(arr2); // arr is [1,2,3,4,5,6];
Сортировка массивов
В JavaScript числа и строки сортируются, как и ожидалось, в числовом и алфавитном порядке. Однако следите за массивами числовых строк. Если вы отсортировали ['1','2','3','4','5','6','7','8','9','10']
, вы можете ожидать, что ничего не произойдет, потому что они кажутся упорядоченными. Но поскольку это строки, вы на самом деле получите ['1','10','2','3','4','5','6','7','8','9']
Мы рассмотрим, как это преодолеть, но сначала нам нужен простой пример:
Простая сортировка
var arr = [2,1,3,4,6,5]; arr = arr.sort(); // arr is now [1,2,3,4,5,6] arr = ['b','a','d','c','e']; arr = arr.sort(); // arr is now ['a','b','c','d','e']
Комплексная сортировка
var arr = ['2','4','6','8','1','3','5','7','9','10'] arr.sort((a,b)=>{ var returnVal = 0; a = parseInt(a); b = parseInt(b); if (a < b) { returnVal = -1; } if (a > b) { returnVal = 1; } return returnVal; }) console.log(arr);
Сортировка может принимать пользовательскую функцию, которая будет вызываться для каждого элемента в массиве. Функция будет вызываться с двумя аргументами: текущим значением индекса и следующим значением индекса. Чтобы переместить элемент в более низкий индекс, вы должны вернуть -1, для более высокого индекса вернуть 1, а чтобы сохранить элемент в той же позиции, вернуть 0. В приведенном выше примере мы сначала анализируем числовые строки в целые числа. Затем мы сравниваем их друг с другом и возвращаем соответствующее значение.
Фильтрация массивов
Тут особо объяснять нечего. Фильтр работает так, как вы можете догадаться:
var arr = ['apple','orange','lemon','carrot','potato','celery']; function isFruit(val) { return ['apple','orange','lemon'].includes(val); } arr = arr.filter(isFruit); // arr is now ['apple','orange','lemon']
Примечание: в предыдущем примере мы используем метод массива
includes
, который на момент написания статьи не поддерживается IE, но поддерживается Edge. Если вам нужно поддерживать IE, вы должны сделать что-то вроде этого:['apple','orange','lemon'].indexOf(val) !== -1;
Вспомогательные методы
Есть несколько служебных методов массивов, которые очень полезны:
arr.length()
— дает общее количество элементов в массиве
arr.indexOf(item)
— возвращает индекс переданного элемента в массиве. Если элемент не найден, он возвращает -1
arr.includes(item)
— возвращает логическое значение (true или false) в зависимости от того, найден ли переданный элемент в массиве. Это не поддерживается ни в одной версии IE, но есть в Edge.
arr.some(item => item > 10)
— возвращает логическое значение в зависимости от того, возвращает ли заданное условие значение true для некоторых элементов массива. Это принимает функцию, я показываю ее, используя функцию стрелки для простоты.
arr.reverse()
— переворачивает элементы массива внутри массива. Если бы в массиве было 10 элементов, элемент, изначально находившийся в индексе 0, был бы перемещен в индекс 9 и так далее.
Редукторы
Редуктор используется для накопления значений и возврата их в виде меньшего массива или единственного числа. Этот пример взят из MDN.
var total = [0,1,2,3].reduce(function(accumulatedValue, currentItemValue){ return accumulatedValue + currentItemValue; }, 0) // 0 is the initial value of the accumulated value.
Метод сокращения выполняет итерацию по массиву и для каждого элемента в массиве вызывает метод, который принимает функцию обратного вызова и начальное значение аккумулятора. Метод обратного вызова вызывается с двумя параметрами: текущим накопленным значением и текущим значением элемента. Поскольку в этом примере запрашивается общее количество элементов в массиве, мы просто добавляем накопленное значение к значению элемента и возвращаем его.
Для каждого
Метод forEach
— это простой способ выполнить действие для каждого элемента массива. Метод ничего не возвращает и не изменяет исходный массив. Вот пример того, как вы можете его использовать:
var arr = [1,2,3,4], doubled = []; arr.forEach(val => doubled.push(val*2)); // doubled is now [2,4,6,8]
карта
map
во многом похож на forEach
, за исключением того, что он возвращает новый массив на основе действий, выполненных с каждым элементом:
var arr = [1,2,3,4], doubled = arr.map(val => val*2); // doubled is [2,4,6,8]
Итераторы
Я использовал слово «итератор» в этой статье для обозначения того, как метод делает что-то для каждого элемента в массиве. Существуют также специальные итераторы для массивов. Для этих итераторов метод next()
вызывается каждый раз, когда вы готовы к следующему значению в массиве. Есть 2 метода массива, которые возвращают итераторы:
keys
— перебирает все ключи в массиве или объекте (не поддерживается IE)
values
— перебирает все значения в массиве или объекте (не поддерживается Chrome или IE)
Вот пример того, как вы можете использовать итератор:
var arr = ['a','b','c'], iterator = arr.keys(), str = ''; function consStr(iter) { var next = iter.next(); if (!next.done) { str = str + arr[next.value]; consStr(iter); } } consStr(iterator); // str = "abc"
Преимущество итераторов в том, что вам не нужно выполнять все действия над массивом одновременно. Следующий метод итератора можно вызвать в любое время после определения итератора.
Существует множество методов и способов работы с массивами. Для полной документации перейдите на MDN, там вы можете увидеть примеры кода, пояснения и совместимость браузера для всех методов массива. Далее я расскажу о некоторых разногласиях и о некоторых вещах, которые полезно знать, а также о некоторых вещах, которые возникают в вопросах на собеседовании.