Перейти к содержимому

Как получить элемент массива js

  • автор:

Массивы

— это упорядоченная коллекция значений. Значения в массиве называются , и каждый элемент характеризуется числовой позицией в массиве, которая называется . Массивы в языке JavaScript являются нетипизированными: элементы массива могут иметь любой тип, причем разные элементы одного и того же массива могут иметь разные типы. Элементы массива могут даже быть объектами или другими массивами, что позволяет создавать сложные структуры данных, такие как массивы объектов и массивы массивов.

Отсчет индексов массивов в языке JavaScript начинается с нуля и для них используются 32-битные целые числа — первый элемент массива имеет индекс 0. Массивы в JavaScript являются динамическими: они могут увеличиваться и уменьшаться в размерах по мере необходимости; нет необходимости объявлять фиксированные размеры массивов при их создании или повторно распределять память при изменении их размеров.

Массивы в языке JavaScript — это специализированная форма объектов, а индексы массивов означают чуть больше, чем просто имена свойств, которые по совпадению являются целыми числами.

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

Легче всего создать массив с помощью литерала, который представляет собой простой список разделенных запятыми элементов массива в квадратных скобках. Значения в литерале массива не обязательно должны быть константами — это могут быть любые выражения, в том числе и литералы объектов:

var empty = []; // Пустой массив var numbers = [2, 3, 5, 7, 11]; // Массив с пятью числовыми элементами var misc = [ 1.1, true, "a", ]; // 3 элемента разных типов + завершающая запятая var base = 1024; var table = [base, base+1, base+2, base+3]; // Массив с переменными var arrObj = [[1,], [2, ]]; // 2 массива внутри, содержащие объекты

Синтаксис литералов массивов позволяет вставлять необязательную завершающую запятую, т.е. литерал [,,] соответствует массиву с двумя элементами, а не с тремя.

Другой способ создания массива состоит в вызове конструктора Array(). Вызвать конструктор можно тремя разными способами:

    Вызвать конструктор без аргументов:

var arr = new Array();
var arr = new Array(10);
var arr = new Array(5, 4, 3, 2, 1, "тест");

Чтение и запись элементов массива

Доступ к элементам массива осуществляется с помощью оператора []. Слева от скобок должна присутствовать ссылка на массив. Внутри скобок должно находиться произвольное выражение, возвращающее неотрицательное целое значение. Этот синтаксис пригоден как для чтения, так и для записи значения элемента массива. Следовательно, допустимы все приведенные далее JavaScript-инструкции:

// Создать массив с одним элементом var arr = ["world"]; // Прочитать элемент 0 var value = arr[0]; // Записать значение в элемент 1 arr[1] = 3.14; // Записать значение в элемент 2 i = 2; arr[i] = 3; // Записать значение в элемент 3 arr[i + 1] = 'привет'; // Прочитать элементы 0 и 2, записать значение в элемент 3 arr[arr[i]] = arr[0];

Напомню, что массивы являются специализированной разновидностью объектов. Квадратные скобки, используемые для доступа к элементам массива, действуют точно так же, как квадратные скобки, используемые для доступа к свойствам объекта. Интерпретатор JavaScript преобразует указанные в скобках числовые индексы в строки — индекс 1 превращается в строку «1» — а затем использует строки как имена свойств.

В преобразовании числовых индексов в строки нет ничего особенного: то же самое можно проделывать с обычными объектами:

var obj = <>; // Создать простой объект obj[1] = "one"; // Индексировать его целыми числами

Особенность массивов состоит в том, что при использовании имен свойств, которые являются неотрицательными целыми числами, массивы автоматически определяют значение свойства length. Например, выше был создан массив arr с единственным элементом. Затем были присвоены значения его элементам с индексами 1, 2 и 3. В результате этих операций значение свойства length массива изменилось и стало равным 4.

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

Обратите внимание, что в качестве индексов массивов допускается использовать отрицательные и не целые числа. В этом случае числа преобразуются в строки, которые используются как имена свойств.

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

Мы уже видели, что самый простой способ добавить элементы в массив заключается в том, чтобы присвоить значения новым индексам. Для добавления одного или более элементов в конец массива можно также использовать метод push():

var arr = []; // Создать пустой массив arr.push('zero'); // Добавить значение в конец arr.push('one',2); // Добавить еще два значения

Добавить элемент в конец массива можно также, присвоив значение элементу arr[arr.length]. Для вставки элемента в начало массива можно использовать метод unshift(), при этом существующие элементы в массиве смещаются в позиции с более высокими индексами.

Удалять элементы массива можно с помощью оператора delete, как обычные свойства объектов:

var arr = [1,2,'three']; delete arr[2]; 2 in arr; // false, индекс 2 в массиве не определен arr.length; // 3: оператор delete не изменяет свойство length массива

Удаление элемента напоминает (но несколько отличается) присваивание значения undefined этому элементу. Обратите внимание, что применение оператора delete к элементу массива не изменяет значение свойства length и не сдвигает вниз элементы с более высокими индексами, чтобы заполнить пустоту, оставшуюся после удаления элемента.

Кроме того имеется возможность удалять элементы в конце массива простым присваиванием нового значения свойству length. Массивы имеют метод pop() (противоположный методу push()), который уменьшает длину массива на 1 и возвращает значение удаленного элемента. Также имеется метод shift() (противоположный методу unshift()), который удаляет элемент в начале массива. В отличие от оператора delete, метод shift() сдвигает все элементы вниз на позицию ниже их текущих индексов.

Наконец существует многоцелевой метод splice(), позволяющий вставлять, удалять и замещать элементы массивов. Он изменяет значение свойства length и сдвигает элементы массива с более низкими или высокими индексами по мере необходимости. Все эти методы мы разберем чуть позже.

Многомерные массивы

JavaScript не поддерживает «настоящие» многомерные массивы, но позволяет неплохо имитировать их при помощи массивов из массивов. Для доступа к элементу данных в массиве массивов достаточно дважды использовать оператор [].

Например, предположим, что переменная matrix — это массив массивов чисел. Каждый элемент matrix[x] — это массив чисел. Для доступа к определенному числу в массиве можно использовать выражение matrix[x][y]. Ниже приводится конкретный пример, где двумерный массив используется в качестве таблицы умножения:

// Создать многомерный массив var table = new Array(10); // В таблице 10 строк for(var i = 0; i < table.length; i++) table[i] = new Array(10); // В каждой строке 10 столбцов // Инициализировать массив и вывести на консоль for(var row = 0, str = ''; row < table.length; row++) < for(var col = 0; col < table[row].length; col++) < table[row][col] = (row+1)*(col+1); str += table[row][col] + ' '; >console.log(str + '\n'); str = ''; >

Использование многомерных массивов в JavaScript

Методы класса Array

Стандарт ECMAScript 3 определяет в составе Array.prototype множество удобных функций для работы с массивами, которые доступны как методы любого массива. Эти методы будут представлены в следующих подразделах.

Метод join()

Метод Array.join() преобразует все элементы массива в строки, объединяет их и возвращает получившуюся строку. В необязательном аргументе методу можно передать строку, которая будет использоваться для отделения элементов в строке результата. Если строка-разделитель не указана, используется запятая. Например, следующий фрагмент дает в результате строку «1,2,3»:

var arr = [1,2,3]; arr.join(); // '1,2,3' arr.join("-"); // '1-2-3'

Метод reverse()

Метод Array.reverse() меняет порядок следования элементов в массиве на обратный и возвращает переупорядоченный массив. Перестановка выполняется непосредственно в исходном массиве, т.е. этот метод не создает новый массив с переупорядоченными элементами, а переупорядочивает их в уже существующем массиве. Например, следующий фрагмент, где используются методы reverse() и join(), дает в результате строку «3,2,1»:

var arr = [1,2,3]; arr.reverse().join(); // "3,2,1"

Метод sort()

Метод Array.sort() сортирует элементы в исходном массиве и возвращает отсортированный массив. Если метод sort() вызывается без аргументов, сортировка выполняется в алфавитном порядке (для сравнения элементы временно преобразуются в строки, если это необходимо). Неопределенные элементы переносятся в конец массива.

Для сортировки в каком-либо ином порядке, отличном от алфавитного, методу sort() можно передать функцию сравнения в качестве аргумента. Эта функция устанавливает, какой из двух ее аргументов должен следовать раньше в отсортированном списке. Если первый аргумент должен предшествовать второму, функция сравнения должна возвращать отрицательное число. Если первый аргумент должен следовать за вторым в отсортированном массиве, то функция должна возвращать число больше нуля. А если два значения эквивалентны (т.е. порядок их следования не важен), функция сравнения должна возвращать 0:

var arr = [33, 4, 1111, 222]; arr.sort(); // Алфавитный порядок: 1111, 222, 33, 4 arr.sort(function(a,b) < // Числовой порядок: 4, 33, 222, 1111 return a-b; // Возвращает значение < 0, 0 или >0 // в зависимости от порядка сортировки a и b >); // Сортируем в обратном направлении, от большего к меньшему arr.sort(function(a,b) ); 

Обратите внимание, насколько удобно использовать в этом фрагменте неименованную функцию. Функция сравнения используется только здесь, поэтому нет необходимости давать ей имя.

Метод concat()

Метод Array.concat() создает и возвращает новый массив, содержащий элементы исходного массива, для которого был вызван метод concat(), и значения всех аргументов, переданных методу concat(). Если какой-либо из этих аргументов сам является массивом, его элементы добавляются в возвращаемый массив. Следует, однако, отметить, что рекурсивного превращения массива из массивов в одномерный массив не происходит. Метод concat() не изменяет исходный массив. Ниже приводится несколько примеров:

var arr = [1,2,3]; arr.concat(4, 5); // Вернет [1,2,3,4,5] arr.concat([4,5]); // Вернет [1,2,3,4,5] arr.concat([4,5],[6,7]) // Вернет [1,2,3,4,5,6,7] arr.concat(4, [5,[6,7]]) // Вернет [1,2,3,4,5,[6,7]]

Метод slice()

Метод Array.slice() возвращает фрагмент, или подмассив, указанного массива. Два аргумента метода определяют начало и конец возвращаемого фрагмента. Возвращаемый массив содержит элемент, номер которого указан в первом аргументе, плюс все последующие элементы, вплоть до (но не включая) элемента, номер которого указан во втором аргументе.

Если указан только один аргумент, возвращаемый массив содержит все элементы от начальной позиции до конца массива. Если какой-либо из аргументов имеет отрицательное значение, он определяет номер элемента относительно конца массива. Так, аргументу -1 соответствует последний элемент массива, а аргументу -3 — третий элемент массива с конца. Вот несколько примеров:

var arr = [1,2,3,4,5]; arr.slice(0,3); // Вернет [1,2,3] arr.slice(3); // Вернет [4,5] arr.slice(1,-1); // Вернет [2,3,4] arr.slice(-3,-2); // Вернет [3]

Метод splice()

Метод Array.splice() — это универсальный метод, выполняющий вставку или удаление элементов массива. В отличие от методов slice() и concat(), метод splice() изменяет исходный массив, относительно которого он был вызван. Обратите внимание, что методы splice() и slice() имеют очень похожие имена, но выполняют совершенно разные операции.

Метод splice() может удалять элементы из массива, вставлять новые элементы или выполнять обе операции одновременно. Элементы массива при необходимости смещаются, чтобы после вставки или удаления образовывалась непрерывная последовательность.

Первый аргумент метода splice() определяет позицию в массиве, начиная с которой будет выполняться вставка и/или удаление. Второй аргумент определяет количество элементов, которые должны быть удалены (вырезаны) из массива. Если второй аргумент опущен, удаляются все элементы массива от указанного до конца массива. Метод splice() возвращает массив удаленных элементов или (если ни один из элементов не был удален) пустой массив.

Первые два аргумента метода splice() определяют элементы массива, подлежащие удалению. За этими аргументами может следовать любое количество дополнительных аргументов, определяющих элементы, которые будут вставлены в массив, начиная с позиции, указанной в первом аргументе.

var arr = [1,2,3,4,5,6,7,8]; arr.splice(4); // Вернет [5,6,7,8], arr = [1,2,3,4] arr.splice(1,2); // Вернет [2,3], arr = [1,4] arr.splice(1,1); // Вернет [4]; arr = [1] arr = [1,2,3,4,5]; arr.splice(2,0,'a','b'); // Вернет []; arr = [1,2,'a','b',3,4,5]

Методы push() и pop()

Методы push() и pop() позволяют работать с массивами как со стеками. Метод push() добавляет один или несколько новых элементов в конец массива и возвращает его новую длину. Метод pop() выполняет обратную операцию — удаляет последний элемент массива, уменьшает длину массива и возвращает удаленное им значение. Обратите внимание, что оба эти метода изменяют исходный массив, а не создают его модифицированную копию.

Методы unshift() и shift()

Методы unshift() и shift() ведут себя почти так же, как push() и pop(), за исключением того, что они вставляют и удаляют элементы в начале массива, а не в конце. Метод unshift() смещает существующие элементы в сторону больших индексов для освобождения места, добавляет элемент или элементы в начало массива и возвращает новую длину массива. Метод shift() удаляет и возвращает первый элемент массива, смещая все последующие элементы на одну позицию вниз, чтобы занять место, освободившееся в начале массива.

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

Для поиска по массиву в JavaScript существует несколько методов прототипа Array, не считая что поиск можно выполнить и методами для перебора массива и в обычном цикле.

Итак, мы сегодня рассмотрим следующие варианты:

  • Array.includes()
  • Array.indexOf()
  • Array.find()
  • Array.findIndex()
  • Array.filter()
  • Array.forEach()

Array.includes() — есть ли элемент в массиве

Данный метод ищет заданный элемент и возвращает true или false , в зависимости от результата поиска. Принимает два параметра:

  • element — то, что мы будем искать
  • fromIndex (необязательный) — с какого индекса начинать поиск. По умолчанию с 0.
const arr = ['Apple', 'Orange', 'Lemon', 'Cherry']; console.log(arr.includes('Apple')); // true console.log(arr.includes('Apple', 1)); // false

Как видно из примера выше, в первом случае мы получим true , т.к. начали с нулевого элемента массива. Во втором случае мы передали второй параметр — индекс, с которого нужно начать поиск — и получили false , т.к. дальше элемент не был найден.

Array.indexOf() — индекс элемента в массиве

Данный метод, в отличие от предыдущего, возвращает индекс первого найденного совпадения. В случае если элемент не найден, будет возвращено число -1

Также принимает два параметра:

  • element — элемент, который мы будем искать
  • fromIndex (необязательный) — с какого индекса начинать поиск. По умолчанию с 0.
const arr = ['Apple', 'Orange', 'Lemon', 'Cherry', 'Apple']; console.log(arr.indexOf('Apple')); // 0 console.log(arr.indexOf('Apple', 1)); // 4 console.log(arr.indexOf('Orange', 2)); // -1

Как видно из примера выше, в первом случае мы получаем 0, т.к. сразу нашли первый элемент массива (первое совпадение, дальше поиск уже не выполняется). Во втором случае 4, т.к. начали поиск с индекса 1 и нашли следующее совпадение. В третьем примере мы получили результат -1, т.к. поиск начали с индекса 2, а элемент Orange в нашем массиве под индексом 1.

Так как данный метод возвращает индекс или -1, мы можем присвоить результат в переменную для дальнейшего использования:

const arr = ['Apple', 'Orange', 'Lemon', 'Cherry', 'Apple']; const index = arr.indexOf('Lemon'); if (index !== -1) < // сделать что-то >

Чтобы произвести какие-то действия над найденным элементом массива, мы можем использовать следующий синтаксис:

const arr = ['Apple', 'Orange', 'Lemon', 'Cherry', 'Apple']; const index = arr.indexOf('Lemon'); arr[index] = 'Lime'; // заменяем найденный элемент console.log(arr)ж // ['Apple', 'Orange', 'Lime', 'Cherry', 'Apple']

Примеры использования данного метода вы можете также найти в посте про удаление элемента из массива

Array.find() — найти элемент по условию

Данный метод callback и thisArg в качестве аргументов и возвращает первое найденное значение.

Callback принимает несколько аргументов:
item — текущий элемент массива
index — индекс текущего элемента
currentArray — итерируемый массив

const arr = ['Apple', 'Orange', 'Lemon', 'Cherry', 'Apple']; const apple = arr.find(item => item === 'Apple'); console.log(apple); // Apple

Данный метод полезен тем, что мы можем найти и получить сразу и искомый элемент, и его index

const arr = ['Apple', 'Orange', 'Lemon', 'Cherry', 'Apple']; let indexOfEl; const apple = arr.find((item, index) => < if (item === 'Apple') < indexOfEl = index; return item; >>); console.log(apple, indexOfEl); // Apple 0

Также работа кода прекратиться как только будет найден нужный элемент и второй элемент (дубликат) не будет найден.

В случае если ничего не найдено будет возвращен undefined .

Array.findIndex() — найти индекс элемента в массиве

Этот метод похож на метод find() , но возвращать будет только индекс элемента, который соответствует требованию. В случае, если ничего не найдено, вернет -1

const arr = ['Apple', 'Orange', 'Lemon', 'Cherry', 'Apple']; const index = arr.findIndex(item => item === 'Apple'); console.log(index); // 0

Ну и по аналогии с предыдущим методом, поиск завершается после первого совпадения.

Поиск всех совпадений в массиве

Метод filter() кроме всего остального также можно использовать для поиска по массиву. Предыдущие методы останавливаются при первом соответствии поиска, а данный метод пройдется по массиву до конца и найдет все элементы. Но данный метод вернет новый массив, в который войдут все элементы соответствующие условию.

const arr = ['Apple', 'Orange', 'Lemon', 'Cherry', 'Apple']; const filteredArr = arr.filter(item => item === 'Apple'); console.log(filteredArr); // ['Apple', 'Apple'] console.log(arr); // ['Apple', 'Orange', 'Lemon', 'Cherry', 'Apple'];

Как видите из примера выше, первоначальный массив не будет изменен.

Подробнее про метод JS filter() можете прочитать в этом посте.

Для этих же целей можно использовать метод forEach(), который предназначен для перебора по массиву:

const arr = ['Apple', 'Orange', 'Lemon', 'Cherry', 'Apple']; let indexes = []; arr.forEach((item, index) => < if (item === 'Apple') indexes.push(index) >); console.log(indexes); // [0, 4]

В массив indexes мы получили индексы найденных элементов, это 0 и 4 элементы. Также в зависимости от вашей необходимости, можно создать объект, где ключом будет индекс, а значением сам элемент:

const arr = ['Apple', 'Orange', 'Lemon', 'Cherry', 'Apple']; let arrObjMap = <>; arr.forEach((item, index) => < if (item === 'Apple') < arrObjMap[index] = item; >>); console.log(arrObjMap); //

Поиск в массиве объектов

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

Первый способ. С использованием метода map для массива

const arr = [ < name: 'Ben', age: 21 >, < name: 'Clif', age: 22 >, < name: 'Eric', age: 18 >, < name: 'Anna', age: 27 >, ]; const index = arr.map(item => item.name).indexOf('Anna'); console.log(index); //3 console.log(arr[index]); //

В данном случае по массиву arr мы проходим и на каждой итерации из текущего элемента (а это объект со свойствами name и age ) возвращаем имя человека в новый массив и сразу же выполняем поиск по новому массиву на имя Anna. При совпадении нам будет возвращен индекс искомого элемента в массиве.

Второй способ. Данный вариант будет немного проще, т.к. мы можем сразу получить индекс при совпадении:

const index = arr.findIndex(item => item.name === 'Anna'); console.log(index); //3 console.log(arr[index]); //

Заключение

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

Ваши вопросы и комментарии:

Свежие записи

  • MySQL IS NULL — проверка поля на NULL
  • MySQL LIKE — поиск по паттерну
  • Between MySQL — оператор для выборки по диапазону значений
  • MySQL IN и NOT IN — несколько условий
  • MySQL WHERE — синтаксис и примеры

Копирование материалов разрешено только с ссылкой на источник Web-Dev.guru
2024 © Все права защищены.

Массивы

Объекты позволяют хранить данные со строковыми ключами. Это замечательно.

Но довольно часто мы понимаем, что нам необходима упорядоченная коллекция данных, в которой присутствуют 1-й, 2-й, 3-й элементы и т.д. Например, она понадобится нам для хранения списка чего-либо: пользователей, товаров, элементов HTML и т.д.

В этом случае использовать объект неудобно, так как он не предоставляет методов управления порядком элементов. Мы не можем вставить новое свойство «между» уже существующими. Объекты просто не предназначены для этих целей.

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

Объявление

Существует два варианта синтаксиса для создания пустого массива:

let arr = new Array(); let arr = [];

Практически всегда используется второй вариант синтаксиса. В скобках мы можем указать начальные значения элементов:

let fruits = ["Яблоко", "Апельсин", "Слива"];

Элементы массива нумеруются, начиная с нуля.

Мы можем получить элемент, указав его номер в квадратных скобках:

let fruits = ["Яблоко", "Апельсин", "Слива"]; alert( fruits[0] ); // Яблоко alert( fruits[1] ); // Апельсин alert( fruits[2] ); // Слива

Мы можем заменить элемент:

fruits[2] = 'Груша'; // теперь ["Яблоко", "Апельсин", "Груша"]

…Или добавить новый к существующему массиву:

fruits[3] = 'Лимон'; // теперь ["Яблоко", "Апельсин", "Груша", "Лимон"]

Общее число элементов массива содержится в его свойстве length :

let fruits = ["Яблоко", "Апельсин", "Слива"]; alert( fruits.length ); // 3

Вывести массив целиком можно при помощи alert .

let fruits = ["Яблоко", "Апельсин", "Слива"]; alert( fruits ); // Яблоко, Апельсин, Слива

В массиве могут храниться элементы любого типа.

// разные типы значений let arr = [ 'Яблоко', < name: 'Джон' >, true, function() < alert('привет'); >]; // получить элемент с индексом 1 (объект) и затем показать его свойство alert( arr[1].name ); // Джон // получить элемент с индексом 3 (функция) и выполнить её arr[3](); // привет

Висячая запятая

Список элементов массива, как и список свойств объекта, может оканчиваться запятой:

let fruits = [ "Яблоко", "Апельсин", "Слива", ];

«Висячая запятая» упрощает процесс добавления/удаления элементов, так как все строки становятся идентичными.

Получение последних элементов при помощи «at»

Новая возможность
Эта возможность была добавлена в язык недавно. В старых браузерах может понадобиться полифил.

Допустим, нам нужен последний элемент массива.

Некоторые языки программирования позволяют использовать отрицательные индексы для той же цели, как-то так: fruits[-1] .

Однако, в JavaScript такая запись не сработает. Её результатом будет undefined , поскольку индекс в квадратных скобках понимается буквально.

Мы можем явно вычислить индекс последнего элемента, а затем получить к нему доступ вот так: fruits[fruits.length — 1] .

let fruits = ["Apple", "Orange", "Plum"]; alert( fruits[fruits.length-1] ); // Plum

Немного громоздко, не так ли? Нам нужно дважды написать имя переменной.

К счастью, есть более короткий синтаксис: fruits.at(-1) :

let fruits = ["Apple", "Orange", "Plum"]; // то же самое, что и fruits[fruits.length-1] alert( fruits.at(-1) ); // Plum

Другими словами, arr.at(i) :

  • это ровно то же самое, что и arr[i] , если i >= 0 .
  • для отрицательных значений i , он отступает от конца массива.

Методы pop/push, shift/unshift

Очередь – один из самых распространённых вариантов применения массива. В области компьютерных наук так называется упорядоченная коллекция элементов, поддерживающая два вида операций:

  • push добавляет элемент в конец.
  • shift удаляет элемент в начале, сдвигая очередь, так что второй элемент становится первым.

Массивы поддерживают обе операции.

На практике необходимость в этом возникает очень часто. Например, очередь сообщений, которые надо показать на экране.

Существует и другой вариант применения для массивов – структура данных, называемая стек.

Она поддерживает два вида операций:

  • push добавляет элемент в конец.
  • pop удаляет последний элемент.

Таким образом, новые элементы всегда добавляются или удаляются из «конца».

Примером стека обычно служит колода карт: новые карты кладутся наверх и берутся тоже сверху:

Массивы в JavaScript могут работать и как очередь, и как стек. Мы можем добавлять/удалять элементы как в начало, так и в конец массива.

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

Методы, работающие с концом массива:

Удаляет последний элемент из массива и возвращает его:

let fruits = ["Яблоко", "Апельсин", "Груша"]; alert( fruits.pop() ); // удаляем "Груша" и выводим его alert( fruits ); // Яблоко, Апельсин

И fruits.pop() и fruits.at(-1) возвращают последний элемент массива, но fruits.pop() также изменяет массив, удаляя его.

Добавляет элемент в конец массива:

let fruits = ["Яблоко", "Апельсин"]; fruits.push("Груша"); alert( fruits ); // Яблоко, Апельсин, Груша

Вызов fruits.push(. ) равнозначен fruits[fruits.length] = . .

Методы, работающие с началом массива:

Удаляет из массива первый элемент и возвращает его:

let fruits = ["Яблоко", "Апельсин", "Груша"]; alert( fruits.shift() ); // удаляем Яблоко и выводим его alert( fruits ); // Апельсин, Груша

Добавляет элемент в начало массива:

let fruits = ["Апельсин", "Груша"]; fruits.unshift('Яблоко'); alert( fruits ); // Яблоко, Апельсин, Груша

Методы push и unshift могут добавлять сразу несколько элементов:

let fruits = ["Яблоко"]; fruits.push("Апельсин", "Груша"); fruits.unshift("Ананас", "Лимон"); // ["Ананас", "Лимон", "Яблоко", "Апельсин", "Груша"] alert( fruits );

Внутреннее устройство массива

Массив – это особый подвид объектов. Квадратные скобки, используемые для того, чтобы получить доступ к свойству arr[0] – это по сути обычный синтаксис доступа по ключу, как obj[key] , где в роли obj у нас arr , а в качестве ключа – числовой индекс.

Массивы расширяют объекты, так как предусматривают специальные методы для работы с упорядоченными коллекциями данных, а также свойство length . Но в основе всё равно лежит объект.

Следует помнить, что в JavaScript существует 8 основных типов данных. Массив является объектом и, следовательно, ведёт себя как объект.

Например, копируется по ссылке:

let fruits = ["Банан"] let arr = fruits; // копируется по ссылке (две переменные ссылаются на один и тот же массив) alert( arr === fruits ); // true arr.push("Груша"); // массив меняется по ссылке alert( fruits ); // Банан, Груша - теперь два элемента

…Но то, что действительно делает массивы особенными – это их внутреннее представление. Движок JavaScript старается хранить элементы массива в непрерывной области памяти, один за другим, так, как это показано на иллюстрациях к этой главе. Существуют и другие способы оптимизации, благодаря которым массивы работают очень быстро.

Но все они утратят эффективность, если мы перестанем работать с массивом как с «упорядоченной коллекцией данных» и начнём использовать его как обычный объект.

Например, технически мы можем сделать следующее:

let fruits = []; // создаём массив fruits[99999] = 5; // создаём свойство с индексом, намного превышающим длину массива fruits.age = 25; // создаём свойство с произвольным именем

Это возможно, потому что в основе массива лежит объект. Мы можем присвоить ему любые свойства.

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

Варианты неправильного применения массива:

  • Добавление нечислового свойства, например: arr.test = 5 .
  • Создание «дыр», например: добавление arr[0] , затем arr[1000] (между ними ничего нет).
  • Заполнение массива в обратном порядке, например: arr[1000] , arr[999] и т.д.

Массив следует считать особой структурой, позволяющей работать с упорядоченными данными. Для этого массивы предоставляют специальные методы. Массивы тщательно настроены в движках JavaScript для работы с однотипными упорядоченными данными, поэтому, пожалуйста, используйте их именно в таких случаях. Если вам нужны произвольные ключи, вполне возможно, лучше подойдёт обычный объект <> .

Эффективность

Методы push/pop выполняются быстро, а методы shift/unshift – медленно.

Почему работать с концом массива быстрее, чем с его началом? Давайте посмотрим, что происходит во время выполнения:

fruits.shift(); // удаляем первый элемент с начала

Просто взять и удалить элемент с номером 0 недостаточно. Нужно также заново пронумеровать остальные элементы.

Операция shift должна выполнить 3 действия:

  1. Удалить элемент с индексом 0 .
  2. Сдвинуть все элементы влево, заново пронумеровать их, заменив 1 на 0 , 2 на 1 и т.д.
  3. Обновить свойство length .

Чем больше элементов содержит массив, тем больше времени потребуется для того, чтобы их переместить, больше операций с памятью.

То же самое происходит с unshift : чтобы добавить элемент в начало массива, нам нужно сначала сдвинуть существующие элементы вправо, увеличивая их индексы.

А что же с push/pop ? Им не нужно ничего перемещать. Чтобы удалить элемент в конце массива, метод pop очищает индекс и уменьшает значение length .

Действия при операции pop :

fruits.pop(); // удаляем один элемент с конца

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

Аналогично работает метод push .

Перебор элементов

Одним из самых старых способов перебора элементов массива является цикл for по цифровым индексам:

let arr = ["Яблоко", "Апельсин", "Груша"]; for (let i = 0; i

Но для массивов возможен и другой вариант цикла, for..of :

let fruits = ["Яблоко", "Апельсин", "Слива"]; // проходит по значениям for (let fruit of fruits)

Цикл for..of не предоставляет доступа к номеру текущего элемента, только к его значению, но в большинстве случаев этого достаточно. А также это короче.

Технически, так как массив является объектом, можно использовать и вариант for..in :

let arr = ["Яблоко", "Апельсин", "Груша"]; for (let key in arr) < alert( arr[key] ); // Яблоко, Апельсин, Груша >

Но на самом деле это – плохая идея. Существуют скрытые недостатки этого способа:

  1. Цикл for..in выполняет перебор всех свойств объекта, а не только цифровых. В браузере и других программных средах также существуют так называемые «псевдомассивы» – объекты, которые выглядят, как массив. То есть, у них есть свойство length и индексы, но они также могут иметь дополнительные нечисловые свойства и методы, которые нам обычно не нужны. Тем не менее, цикл for..in выведет и их. Поэтому, если нам приходится иметь дело с объектами, похожими на массив, такие «лишние» свойства могут стать проблемой.
  2. Цикл for..in оптимизирован под произвольные объекты, не массивы, и поэтому в 10-100 раз медленнее. Увеличение скорости выполнения может иметь значение только при возникновении узких мест. Но мы всё же должны представлять разницу.

В общем, не следует использовать цикл for..in для массивов.

Немного о «length»

Свойство length автоматически обновляется при изменении массива. Если быть точными, это не количество элементов массива, а наибольший цифровой индекс плюс один.

Например, единственный элемент, имеющий большой индекс, даёт большую длину:

let fruits = []; fruits[123] = "Яблоко"; alert( fruits.length ); // 124

Обратите внимание, что обычно мы не используем массивы таким образом.

Ещё один интересный факт о свойстве length – его можно перезаписать.

Если мы вручную увеличим его, ничего интересного не произойдёт. Зато, если мы уменьшим его, массив станет короче. Этот процесс необратим, как мы можем понять из примера:

let arr = [1, 2, 3, 4, 5]; arr.length = 2; // укорачиваем до двух элементов alert( arr ); // [1, 2] arr.length = 5; // возвращаем length как было alert( arr[3] ); // undefined: значения не восстановились

Таким образом, самый простой способ очистить массив – это arr.length = 0; .

new Array()

Существует ещё один вариант синтаксиса для создания массива:

let arr = new Array("Яблоко", "Груша", "и тд");

Он редко применяется, так как квадратные скобки [] короче. Кроме того, у него есть хитрая особенность.

Если new Array вызывается с одним аргументом, который представляет собой число, он создаёт массив без элементов, но с заданной длиной.

Давайте посмотрим, как можно оказать себе медвежью услугу:

let arr = new Array(2); // создастся ли массив [2]? alert( arr[0] ); // undefined! нет элементов. alert( arr.length ); // length 2

Как мы видим, в коде, представленном выше, в new Array(number) все элементы равны undefined .

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

Многомерные массивы

Массивы могут содержать элементы, которые тоже являются массивами. Это можно использовать для создания многомерных массивов, например, для хранения матриц:

let matrix = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]; alert( matrix[1][1] ); // 5, центральный элемент

toString

Массивы по-своему реализуют метод toString , который возвращает список элементов, разделённых запятыми.

let arr = [1, 2, 3]; alert( arr ); // 1,2,3 alert( String(arr) === '1,2,3' ); // true

Давайте теперь попробуем следующее:

Array

Объект Array , как и массивы в других языках программирования, позволяет хранить коллекцию из нескольких элементов под одним именем переменной и имеет методы для выполнения общих операций с массивами.

Описание

Массивы являются спископодобными объектами, чьи прототипы содержат методы для операций обхода и изменения массива. Ни размер JavaScript-массива, ни типы его элементов не являются фиксированными. Поскольку размер массива может увеличиваться и уменьшаться в любое время, то нет гарантии, что массив окажется плотным. То есть, при работе с массивом может возникнуть ситуация, что элемент массива, к которому вы обратитесь, будет пустым и вернёт undefined . В целом, это удобная характеристика; но если эта особенность массива не желательна в вашем специфическом случае, вы можете рассмотреть возможность использования типизированных массивов.

Некоторые полагают, что вы не должны использовать массив в качестве ассоциативного массива. В любом случае, вместо него вы можете использовать простые объекты , хотя у них есть и свои подводные камни. Смотрите пост Легковесные JavaScript-словари с произвольными ключами(англ.) в качестве примера.

Доступ к элементам массива

Массивы в JavaScript индексируются с нуля: первый элемент массива имеет индекс, равный 0 , а индекс последнего элемента равен значению свойства массива length минус 1.

const arr = ["первый элемент", "второй элемент", "последний элемент"]; console.log(arr[0]); // напечатает 'первый элемент' console.log(arr[1]); // напечатает 'второй элемент' console.log(arr[arr.length - 1]); // напечатает 'последний элемент' 

Элементы массива являются свойствами, точно такими же, как, например, свойство toString , однако попытка получить элемент массива по имени его свойства приведёт к синтаксической ошибке, поскольку имя свойства не является допустимым именем JavaScript:

.log(arr.0); // синтаксическая ошибка 

Это не особенность массивов или их свойств. В JavaScript к свойствам, начинающимся с цифры, невозможно обратиться посредством точечной нотации; к ним можно обратиться только с помощью скобочной нотации. Например, если у вас есть объект со свойством, названным ‘3d’ , вы сможете обратиться к нему только посредством скобочной нотации. Примеры:

const years = [1950, 1960, 1970, 1980, 1990, 2000, 2010]; console.log(years.0); // синтаксическая ошибка console.log(years[0]); // работает как положено 
.3d.setTexture(model, 'character.png'); // синтаксическая ошибка renderer['3d'].setTexture(model, 'character.png'); // работает как положено 

Обратите внимание, что во втором примере 3d заключено в кавычки: ‘3d’ . Индексы можно заключать в кавычки (например years[‘2’] вместо years[2] ), но в этом нет необходимости. Значение 2 в выражении years[2] будет неявно приведено к строке движком JavaScript через метод преобразования toString . Именно по этой причине ключи ‘2’ и ’02’ будут ссылаться на два разных элемента в объекте years и следующий пример выведет true :

.log(years["2"] != years["02"]); 

Аналогично, к свойствам объекта, являющимся зарезервированными словами(!) можно получить доступ только посредством скобочной нотации:

const promise =  var: "text", array: [1, 2, 3, 4], >; console.log(promise["array"]); 

Взаимосвязь свойства length с числовыми свойствами

Свойство массивов length взаимосвязано с числовыми свойствами. Некоторые встроенные методы массива (например, join , slice , indexOf и т.д.) учитывают значение свойства length при своём вызове. Другие методы (например, push , splice и т.д.) в результате своей работы также обновляют свойство length массива.

const fruits = []; fruits.push("банан", "яблоко", "персик"); console.log(fruits.length); // 3 

При установке свойства в массиве, если свойство имеет действительный индекс и этот индекс выходит за пределы текущих границ массива, движок соответствующим образом обновит свойство length :

[5] = "манго"; console.log(fruits[5]); // 'манго' console.log(Object.keys(fruits)); // ['0', '1', '2', '5'] console.log(fruits.length); // 6 

Увеличиваем свойство length

.length = 10; console.log(Object.keys(fruits)); // ['0', '1', '2', '5'] console.log(fruits.length); // 10 

Однако, уменьшение свойства length приведёт к удалению элементов.

.length = 2; console.log(Object.keys(fruits)); // ['0', '1'] console.log(fruits.length); // 2 

Более подробно эта тема освещена на странице, посвящённой свойству Array.length .

Создание массива с использованием результата сопоставления

Результатом сопоставления регулярного выражения строке является JavaScript-массив. Этот массив имеет свойства и элементы, предоставляющие информацию о сопоставлении. Подобные массивы возвращаются методами RegExp.exec , String.match и String.replace . Чтобы было проще понять, откуда и какие появились свойства и элементы, посмотрите следующий пример и обратитесь к таблице ниже:

// Сопоставляется с одним символом d, за которым следует один // или более символов b, за которыми следует один символ d // Запоминаются сопоставившиеся символы b и следующий за ними символ d // Регистр игнорируется const myRe = /d(b+)(d)/i; const myArray = myRe.exec("cdbBdbsbz"); 

Свойства и элементы, возвращаемые из данного сопоставления, описаны ниже:

Свойство/Элемент Описание Пример
input Свойство только для чтения, отражающее оригинальную строку, с которой сопоставлялось регулярное выражение. cdbBdbsbz
index Свойство только для чтения, являющееся индексом (отсчёт начинается с нуля) в строке, с которого началось сопоставление. 1
[0] Элемент только для чтения, определяющий последние сопоставившиеся символы. dbBd
[1], . [n] Элементы только для чтения, определяющие сопоставившиеся подстроки, заключённые в круглые скобки, если те включены в регулярное выражение. Количество возможных подстрок не ограничено. [1]: bB [2]: d

Конструктор

Создаёт новый объект Array .

Статические свойства

Возвращает конструктор Array .

Статические методы

Создаёт новый экземпляр Array из итерируемого или массивоподобного объекта.

Создаёт новый экземпляр Array из асинхронно итерируемого, итерируемого или массивоподобного объекта.

Возвращает true если аргумент является массивом и false в противном случае.

Создаёт новый экземпляр Array с переменным количеством аргументов, независимо от количества или типа аргументов.

Свойства экземпляра

Эти свойства определены в Array.prototype и есть у всех экземпляров Array .

Функция-конструктор, создающая экземпляр объекта. Для экземпляров Array начальным значением является конструктор Array (en-US).

Содержит имена свойств, которые не включены в стандарт ECMAScript до версии ES2015 и которые игнорируются оператором with .

Собственные свойства каждого экземпляра Array :

Отражает количество элементов в массиве.

Методы экземпляра

Возвращает элемент массива с указанным индексом. Принимает отрицательные значения, для которых отсчёт идёт с конца массива.

Возвращает новый массив, который является объединением текущего с другими массивами или значениями.

Копирует последовательность элементов внутри массива.

Возвращает новый объект array iterator, который содержит пары ключ/значение для каждого индекса в массиве.

Возвращает true если для каждого элемента массива переданная в качестве аргумента функция возвращает true .

Заполняет все элементы массива от начального индекса до последнего указанным значением.

Возвращает новый массив, содержащий все элементы исходного массива, для которых переданная функция вернула true .

Возвращает значение первого элемента массива, для которого переданная в качестве аргумента функция возвращает true , или undefined если таких элементов нет.

Возвращает индекс первого элемента массива, для которого переданная в качестве аргумента функция возвращает true , или -1 если таких элементов нет.

Возвращает значение последнего элемента массива, для которого переданная в качестве аргумента функция возвращает true , или undefined если таких элементов нет.

Возвращает индекс последнего элемента массива, для которого переданная в качестве аргумента функция возвращает true , или -1 если таких элементов нет.

Возвращает новый массив, содержащий элементы всех вложенных массивов до указанной глубины.

Возвращает новый массив, сформированный вызовом переданной функции с каждым элементом, а затем «уплощённый» на один уровень.

Вызывает функцию для каждого элемента массива.

Возвращает true , если массив содержит переданное значение и false в противном случае.

Возвращает первый (наименьший) индекс, по которому может быть найден переданный элемент.

Объединяет все элементы массива в строку.

Возвращает новый объект array iterator, который содержит ключи каждого индекса массива.

Возвращает последний (наибольший) индекс, по которому может быть найден переданный элемент или -1 если таких элементов нет.

Возвращает новый массив, содержащий результат применения переданной функции к каждому элементу исходного массива.

Удаляет последний элемент массива и возвращает его значение.

Добавляет один или более элементов в конец массива и возвращает новое значение length массива.

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

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

Изменяет порядок элементов массива на месте (то есть изменяя исходный массив) на обратный (первый станет последним, последний — первым).

Удаляет первый элемент массива и возвращает его значение.

Извлекает часть массива и возвращает её в виде нового массива.

Возвращает true если хотя бы для одного элемента массива переданная в качестве аргумента функция возвращает true .

Сортирует элементы массива на месте (то есть изменяя исходный массив) и возвращает массив.

Добавляет и/или удаляет элементы массива.

Возвращает локализованную строку, представляющую исходный массив и его элементы. Переопределяет метод Object.prototype.toLocaleString() .

Возвращает новый массив с элементами в обратном порядке без изменения исходного массива.

Возвращает новый массив с отсортированными по возрастанию элементами без изменения исходного массива.

Возвращает новый массив с удалёнными и/или заменёнными элементами без изменения исходного массива.

Возвращает строку, представляющую исходный массив и его элементы. Переопределяет метод Object.prototype.toString() .

Добавляет один или более элементов в начало массива и возвращает новое значение length массива.

Возвращает новый объект array iterator, который содержит значения каждого индекса массива.

Возвращает новый массив с заменённым значением элемента с указанным индексом без изменения исходного массива.

Примеры

Пример: создание массива

Следующий пример создаёт массив msgArray с длиной 0, присваивает значения элементам msgArray[0] и msgArray[99] , что изменяет длину массива на 100.

const msgArray = []; msgArray[0] = "Привет"; msgArray[99] = "мир"; if (msgArray.length === 100)  console.log("Длина равна 100."); > 

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

const fruits = ["Яблоко", "Банан"]; console.log(fruits.length); // 2 

Доступ к элементу массива по индексу

const first = fruits[0]; // Яблоко const last = fruits[fruits.length - 1]; // Банан 

Итерирование по массиву

.forEach(function (item, index, array)  console.log(item, index); >); // Яблоко 0 // Банан 1 

Добавление элемента в конец массива

const newLength = fruits.push("Апельсин"); // ["Яблоко", "Банан", "Апельсин"] 

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

const last = fruits.pop(); // удалим Апельсин (из конца) // ["Яблоко", "Банан"]; 

Удаление первого элемента массива

const first = fruits.shift(); // удалим Яблоко (из начала) // ["Банан"]; 

Добавление элемента в начало массива

const newLength = fruits.unshift("Клубника"); // добавляет в начало // ["Клубника", "Банан"]; 

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

.push("Манго"); // ["Клубника", "Банан", "Манго"] const pos = fruits.indexOf("Банан"); // 1 

Удаление элемента с определённым индексом

const removedItem = fruits.splice(pos, 1); // так можно удалить элемент // ["Клубника", "Манго"] 

Удаление нескольких элементов, начиная с определённого индекса

const vegetables = ["Капуста", "Репа", "Редиска", "Морковка"]; console.log(vegetables); // ["Капуста", "Репа", "Редиска", "Морковка"] const start = 1; const deleteCount = 2; const removedItems = vegetables.splice(start, deleteCount); // так можно удалить элементы, deleteCount определяет количество элементов для удаления, // начиная с позиции(pos) и далее в направлении конца массива. console.log(vegetables); // ["Капуста", "Морковка"] (исходный массив изменён) console.log(removedItems); // ["Репа", "Редиска"] 

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

const shallowCopy = fruits.slice(); // так можно создать копию массива // ["Клубника", "Манго"] 

Пример: создание двумерного массива

Следующий код создаёт шахматную доску в виде двумерного массива строк. Затем он перемещает пешку путём копирования символа ‘p’ в позиции (6,4) на позицию (4,4). Старая позиция (6,4) затирается пустым местом.

const board = [ ["R", "N", "B", "Q", "K", "B", "N", "R"], ["P", "P", "P", "P", "P", "P", "P", "P"], [" ", " ", " ", " ", " ", " ", " ", " "], [" ", " ", " ", " ", " ", " ", " ", " "], [" ", " ", " ", " ", " ", " ", " ", " "], [" ", " ", " ", " ", " ", " ", " ", " "], ["p", "p", "p", "p", "p", "p", "p", "p"], ["r", "n", "b", "q", "k", "b", "n", "r"], ]; console.log(board.join("\n") + "\n\n"); // Двигаем королевскую пешку вперёд на две клетки board[4][4] = board[6][4]; board[6][4] = " "; console.log(board.join("\n")); 

Ниже показан вывод:

R,N,B,Q,K,B,N,R P,P,P,P,P,P,P,P , , , , , , , , , , , , , , , , , , , , , , , , , , , , p,p,p,p,p,p,p,p r,n,b,q,k,b,n,r R,N,B,Q,K,B,N,R P,P,P,P,P,P,P,P , , , , , , , , , , , , , , , , , ,p, , , , , , , , , , p,p,p,p, ,p,p,p r,n,b,q,k,b,n,r

Спецификации

Specification
ECMAScript Language Specification
# sec-array-objects

Совместимость с браузерами

BCD tables only load in the browser

Смотрите также

  • Упорядоченные наборы данных
  • TypedArray
  • ArrayBuffer

Found a content problem with this page?

  • Edit the page on GitHub.
  • Report the content issue.
  • View the source on GitHub.

This page was last modified on 19 дек. 2023 г. by MDN contributors.

Your blueprint for a better internet.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *