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

Как создать массив

  • автор:

Массивы

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

Необходимые навыки: Базовая компьютерная грамотность, базовое понимание HTML и CSS, понимание о том, что такое JavaScript.
Цель: Понять, что такое массивы и как использовать их в JavaScript.

Что такое массив?

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

Если бы у нас не было массивов, мы должны были бы хранить каждый элемент в отдельной переменной, а затем вызывать код, выполняющий печать и добавляющий отдельно каждый элемент. Написание такого кода займёт намного больше времени, сам код будет менее эффективным и подверженным ошибкам. Если бы у нас было 10 элементов для добавления в счёт-фактуру, это ещё куда ни шло, но как насчёт 100 предметов? Или 1000? Мы вернёмся к этому примеру позже в статье.

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

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

Массивы создаются из квадратных скобок , которые содержат список элементов, разделённых запятыми.

    Допустим, мы бы хотели хранить список покупок в массиве — мы бы сделали что-то вроде этого. Введите следующие строчки в вашу консоль:

var shopping = ["bread", "milk", "cheese", "hummus", "noodles"]; shopping; 
var sequence = [1, 1, 2, 3, 5, 8, 13]; var random = ["tree", 795, [0, 1, 2]]; 

Получение и изменение элементов массива

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

    Введите следующее в вашу консоль:

[0]; // возвращает "bread" 
[0] = "tahini"; shopping; // shopping теперь возвратит [ "tahini", "milk", "cheese", "hummus", "noodles" ] 

Примечание: Мы уже упоминали это прежде, но просто как напоминание — компьютеры начинают считать с нуля!

Нахождение длины массива

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

.length; // должно возвратить 7 

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

var sequence = [1, 1, 2, 3, 5, 8, 13]; for (var i = 0; i  sequence.length; i++)  console.log(sequence[i]); > 

В будущих статьях вы узнаете о циклах, но вкратце этот код говорит:

  1. Начать цикл с номера позиции 0 в массиве.
  2. Остановить цикл на номере элемента, равном длине массива. Это будет работать для массива любой длины, но в этом случае он остановит цикл на элементе номер 7 (это хорошо, поскольку последний элемент, который мы хотим, чтобы цикл был закрыт, равен 6).
  3. Для каждого элемента вернуть его значение в консоли браузера с помощью console.log() .

Некоторые полезные методы массивов

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

Преобразование между строками и массивами

Часто у вас могут быть некоторые необработанные данные, содержащиеся в большой длинной строке, и вы можете захотеть разделить полезные пункты до более удобной и полезной формы, а затем сделать что-то для них, например отобразить их в таблице данных. Для этого мы можем использовать метод split () . В его простейшей форме он принимает единственный параметр, символ, который вы хотите отделить в строке, и возвращает подстроки между разделителем как элементы в массиве.

Примечание: Хорошо, технически это строковый метод, не метод массива, но мы поместили его в массивы, так как он хорошо подходит для них.

  1. Поиграем с этим, посмотрим как это работает. Сначала, создадим строку в вашей консоли:
var myData = "Manchester,London,Liverpool,Birmingham,Leeds,Carlisle"; 
var myArray = myData.split(","); myArray; 
.length; myArray[0]; // первый элемент в массиве myArray[1]; // второй элемент в массиве myArray[myArray.length - 1]; // последний элемент в массиве 
var myNewString = myArray.join(","); myNewString; 
var dogNames = ["Rocket", "Flash", "Bella", "Slugger"]; dogNames.toString(); //Rocket,Flash,Bella,Slugger 

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

Мы ещё не рассмотрели добавление и удаление элементов массива — давайте посмотрим на это сейчас. Мы будем использовать массив myArray , с которым мы столкнулись в предыдущем разделе. Если вы ещё не прошли этот раздел, сначала создайте массив в консоли:

var myArray = [ "Manchester", "London", "Liverpool", "Birmingham", "Leeds", "Carlisle", ]; 

Прежде всего, чтобы добавить или удалить элемент с конца массива, мы можем использовать push() и pop() соответственно.

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

.push("Cardiff"); myArray; myArray.push("Bradford", "Brighton"); myArray; 
var newLength = myArray.push("Bristol"); myArray; newLength; 
var removedItem = myArray.pop(); myArray; removedItem; 

unshift() и shift() работают точно таким же способом, за исключением того что они работают в начале массива, а не в конце.

    Сначала, попробуем метод unshift() :

.unshift("Edinburgh"); myArray; 
var removedItem = myArray.shift(); myArray; removedItem; 

Практика: Печать продуктов!

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

  1. Ниже комментария // number 1 имеется ряд строк, каждая из которых содержит название продукта и цену, разделённые двоеточием. Нужно превратить их в массив и сохранить его под названием products .
  2. На строке с комментарием // number 2 начинается цикл for. В строке цикла имеется i
  3. Под комментарием // number 3 мы хотим, чтобы вы написали строку кода, которая разбивает текущий элемент массива ( name:price ) на два отдельных элемента: один содержит только имя, а другой — содержащее только цену. Если не знаете, как это сделать, ещё раз просмотрите статью Полезные строковые методы, а лучше, посмотрите раздел Преобразование между строками и массивами этой статьи.
  4. В рамках приведённой выше строки нужно преобразовать цену из строки в число. Если не помните, как это сделать, ознакомьтесь со статьёй строки в JavaScript.
  5. В верхней части кода есть переменная с именем total , которая содержит значение 0 . Внутри цикла (под комментарием // number 4 ) нужно добавить строку, которая добавляет текущую цену товара к этой сумме на каждой итерации цикла, так чтобы в конце кода была выведена корректная сумма в счёт-фактуре. Для этого вам может понадобится оператор присваивания.
  6. Под комментарием // number 5 нужно изменить строку так, чтобы переменная itemText была равна «current item name — $current item price», например «Shoes — $23.99» для каждого случая, чтобы корректная информация для каждого элемента была напечатана в счёте-фактуре. Здесь обычная конкатенация строк, которая должна быть вам знакома.
h2>Live outputh2> div class="output" style="min-height: 150px;"> ul>ul> p>p> div> h2>Editable codeh2> p class="a11y-label"> Press Esc to move focus away from the code area (Tab inserts a tab character). p> textarea id="code" class="playable-code" style="height: 410px;width: 95%"> var list = document.querySelector('.output ul'); var totalBox = document.querySelector('.output p'); var total = 0; list.innerHTML = ''; totalBox.textContent = ''; // number 1 'Underpants:6.99' 'Socks:5.99' 'T-shirt:14.99' 'Trousers:31.99' 'Shoes:23.99'; for (var i = 0; i totalBox.textContent = 'Total: $' + total.toFixed(2); textarea> div class="playable-buttons"> input id="reset" type="button" value="Reset" /> input id="solution" type="button" value="Show solution" /> div> 
var textarea = document.getElementById("code"); var reset = document.getElementById("reset"); var solution = document.getElementById("solution"); var code = textarea.value; var userEntry = textarea.value; function updateCode()  eval(textarea.value); > reset.addEventListener("click", function ()  textarea.value = code; userEntry = textarea.value; solutionEntry = jsSolution; solution.value = "Show solution"; updateCode(); >); solution.addEventListener("click", function ()  if (solution.value === "Show solution")  textarea.value = solutionEntry; solution.value = "Hide solution"; > else  textarea.value = userEntry; solution.value = "Show solution"; > updateCode(); >); var jsSolution = "var list = document.querySelector('.output ul');\nvar totalBox = document.querySelector('.output p');\nvar total = 0;\nlist.innerHTML = '';\ntotalBox.textContent = '';\n\nvar products = ['Underpants:6.99',\n 'Socks:5.99',\n 'T-shirt:14.99',\n 'Trousers:31.99',\n 'Shoes:23.99'];\n\nfor(var i = 0; i < products.length; i++) \n\ntotalBox.textContent = 'Total: $' + total.toFixed(2);"; var solutionEntry = jsSolution; textarea.addEventListener("input", updateCode); window.addEventListener("load", updateCode); // stop tab key tabbing out of textarea and // make it write a tab at the caret position instead textarea.onkeydown = function (e)  if (e.keyCode === 9)  e.preventDefault(); insertAtCaret("\t"); > if (e.keyCode === 27)  textarea.blur(); > >; function insertAtCaret(text)  var scrollPos = textarea.scrollTop; var caretPos = textarea.selectionStart; var front = textarea.value.substring(0, caretPos); var back = textarea.value.substring( textarea.selectionEnd, textarea.value.length, ); textarea.value = front + text + back; caretPos = caretPos + text.length; textarea.selectionStart = caretPos; textarea.selectionEnd = caretPos; textarea.focus(); textarea.scrollTop = scrollPos; > // Update the saved userCode every time the user updates the text area code textarea.onkeyup = function ()  // We only want to save the state when the user code is being shown, // not the solution, so that solution is not saved over the user code if (solution.value === "Show solution")  userEntry = textarea.value; > else  solutionEntry = textarea.value; > updateCode(); >; 
html  font-family: sans-serif; > h2  font-size: 16px; > .a11y-label  margin: 0; text-align: right; font-size: 0.7rem; width: 98%; > body  margin: 10px; background-color: #f5f9fa; > 

Практика: Топ 5 поисковых запросов

Хорошим тоном, является использование методов массива, таких как push () и pop () — это когда вы ведёте запись активных элементов в веб-приложении. Например, в анимированной сцене может быть массив объектов, представляющих текущую отображаемую фоновую графику и вам может потребоваться только 50 одновременных отображений по причинам производительности или беспорядка. Когда новые объекты создаются и добавляются в массив, более старые могут быть удалены из массива для поддержания нужного числа.

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

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

Чтобы завершить приложение, вам необходимо:

  1. Добавьте строку под комментарием // number 1 , которая добавляет текущее значение, введённое в ввод поиска, к началу массива. Его можно получить с помощью searchInput.value .
  2. Добавьте строку под комментарием // number 2 , которая удаляет значение, находящееся в конце массива.
h2>Live outputh2> div class="output" style="min-height: 150px;"> input type="text" />button>Searchbutton> ul>ul> div> h2>Editable codeh2> p class="a11y-label"> Press Esc to move focus away from the code area (Tab inserts a tab character). p> textarea id="code" class="playable-code" style="height: 370px; width: 95%"> var list = document.querySelector('.output ul'); var searchInput = document.querySelector('.output input'); var searchBtn = document.querySelector('.output button'); list.innerHTML = ''; var myHistory = []; searchBtn.onclick = function() < // we will only allow a term to be entered if the search input isn't empty if (searchInput.value !== '') < // number 1 // empty the list so that we don't display duplicate entries // the display is regenerated every time a search term is entered. list.innerHTML = ''; // loop through the array, and display all the search terms in the list for (var i = 0; i < myHistory.length; i++) < itemText = myHistory[i]; var listItem = document.createElement('li'); listItem.textContent = itemText; list.appendChild(listItem); >// If the array length is 5 or more, remove the oldest search term if (myHistory.length >= 5) < // number 2 >// empty the search input and focus it, ready for the next term to be entered searchInput.value = ''; searchInput.focus(); > > textarea> div class="playable-buttons"> input id="reset" type="button" value="Reset" /> input id="solution" type="button" value="Show solution" /> div> 
html  font-family: sans-serif; > h2  font-size: 16px; > .a11y-label  margin: 0; text-align: right; font-size: 0.7rem; width: 98%; > body  margin: 10px; background: #f5f9fa; > 
var textarea = document.getElementById("code"); var reset = document.getElementById("reset"); var solution = document.getElementById("solution"); var code = textarea.value; var userEntry = textarea.value; function updateCode()  eval(textarea.value); > reset.addEventListener("click", function ()  textarea.value = code; userEntry = textarea.value; solutionEntry = jsSolution; solution.value = "Show solution"; updateCode(); >); solution.addEventListener("click", function ()  if (solution.value === "Show solution")  textarea.value = solutionEntry; solution.value = "Hide solution"; > else  textarea.value = userEntry; solution.value = "Show solution"; > updateCode(); >); var jsSolution = "var list = document.querySelector('.output ul');\nvar searchInput = document.querySelector('.output input');\nvar searchBtn = document.querySelector('.output button');\n\nlist.innerHTML = '';\n\nvar myHistory= [];\n\nsearchBtn.onclick = function() \n\n if(myHistory.length >= 5) \n\n searchInput.value = '';\n searchInput.focus();\n >\n>"; var solutionEntry = jsSolution; textarea.addEventListener("input", updateCode); window.addEventListener("load", updateCode); // stop tab key tabbing out of textarea and // make it write a tab at the caret position instead textarea.onkeydown = function (e)  if (e.keyCode === 9)  e.preventDefault(); insertAtCaret("\t"); > if (e.keyCode === 27)  textarea.blur(); > >; function insertAtCaret(text)  var scrollPos = textarea.scrollTop; var caretPos = textarea.selectionStart; var front = textarea.value.substring(0, caretPos); var back = textarea.value.substring( textarea.selectionEnd, textarea.value.length, ); textarea.value = front + text + back; caretPos = caretPos + text.length; textarea.selectionStart = caretPos; textarea.selectionEnd = caretPos; textarea.focus(); textarea.scrollTop = scrollPos; > // Update the saved userCode every time the user updates the text area code textarea.onkeyup = function ()  // We only want to save the state when the user code is being shown, // not the solution, so that solution is not saved over the user code if (solution.value === "Show solution")  userEntry = textarea.value; > else  solutionEntry = textarea.value; > updateCode(); >; 

Заключение

Прочитав эту статью, мы уверены, что вы согласитесь, что массивы кажутся довольно полезными; вы увидите, что они появляются повсюду в JavaScript, часто в сочетании с циклами, чтобы делать то же самое для каждого элемента массива. Мы научим вас всем полезным основам, которые нужно знать о циклах в следующем модуле, но пока вы должны себе похлопать и воспользоваться заслуженным перерывом; вы проработали все статьи в этом модуле!

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

Посмотрите также

  • Indexed collections — an advanced level guide to arrays and their cousins, typed arrays.
  • Array — the Array object reference page — for a detailed reference guide to the features discussed in this page, and many more.
  • Назад
  • Обзор: Первые шаги
  • Далее

В этом разделе

  • Что такое JavaScript?
  • A first splash into JavaScript
  • What went wrong? Troubleshooting JavaScript
  • Storing the information you need — Variables
  • Basic math in JavaScript — numbers and operators
  • Handling text — strings in JavaScript
  • Useful string methods
  • Массивы
  • Assessment: Silly story generator

Массивы

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

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

Можно создать пустой массив, используя квадратные скобки или конструктор Array:

const users = new Array(); const people = []; console.log(users); // Array[0] console.log(people); // Array[0]

Можно сразу же инициализировать массив некоторым количеством элементов:

const users = new Array("Tom", "Bill", "Alice"); const people = ["Sam", "John", "Kate"]; console.log(users); // ["Tom", "Bill", "Alice"] console.log(people); // ["Sam", "John", "Kate"]

Можно определить массив и по ходу определять в него новые элементы:

const users = []; users[1] = "Tom"; users[2] = "Kate"; console.log(users[1]); // "Tom" console.log(users[0]); // undefined

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

Еще один способ инициализации массивов представляет метод Array.of() — он принимает элементы и инициизирует ими массив:

const people = Array.of("Tom", "Bob", "Sam"); console.log(people); // ["Tom", "Bob", "Sam"]

Array.from

И еще один способ представляет функция Array.from() . Она имеет много вариантов, рассмотрим самые распространенные:

Array.from(arrayLike) Array.from(arrayLike, function mapFn(element) < . >) Array.from(arrayLike, function mapFn(element, index) < . >)

В качестве первого параметра — arrayLike функция принимает некий объект, который, условно говоря, «похож на массив», то есть может быть представлен в виде набора элементов. Это может быть и другой массив, это может быть и строка, которая по сути предоставляет набор символов. Вообщем какой-то набор элементов, который можно преобразовать в массив. Кроме того, это может и некий объект, в котором определено свойство length . Например:

const array = Array.from("Hello"); console.log(array); // ["H", "e", "l", "l", "o"]

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

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

const numbers = [1, 2, 3, 4]; const array = Array.from(numbers, n => n * n); console.log(array); // [1, 4, 9, 16]

В данном случае в функцию Array.from() передается массив чисел. Второй параметр — функция (в данном случае в ее роли выступает лямбда-выражение) запускается для каждого числа из этого массива и получает это число через параметр n . В самом лямбда-выражении возвращаем квадрат этого числа. В итоге Array.from() возвратит новый массив, в котором будут квадраты чисел из массива numbers.

И еще одна версия функции Array.from() в качестве второго параметра принимает функцию преобразования, в которую кроме элемента из перебираемого набора передается и индекс этого элемента:

Array.from(arrayLike, function mapFn(element, index) < . >)

Используем эту версию и передадим в функцию объект со свойством length :

const array = Array.from(, (element, index) => < console.log(element); // undefined return index; >); console.log(array); // [0, 1, 2]

Здесь в функцию передается объект, у которого свойство length равно 3. Для функции Array.from это будет сигналом, в возвращаемом массиве должно быть три элемента. При этом неважно, что функция преобразования из второго параметра принимает элемент набора (параметр element ) — в данном случае он будет всегда undefined , тем не менее значение length:3 будет указателем, что возвращаемый массив будет иметь три элемента с соответственно индексами от 0 до 2. И через второй параметр функции преобразования — параметр index мы можем и получить текущий индекс элемента.

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

const array = Array.from(, (element) => < console.log(element); return element; >); console.log(array); // ["Tom", "Sam", "Bob"]

length

Чтобы узнать длину массива, используется свойство length :

const fruit = []; fruit[0] = "яблоки"; fruit[1] = "груши"; fruit[2] = "сливы"; console.log("В массиве fruit ", fruit.length, " элемента"); for(let i=0; i < fruit.length; i++) console.log(fruit[i]);

По факту длиной массива будет индекс последнего элемента с добавлением единицы. Например:

const users = []; // в массиве 0 элементов users[0] = "Tom"; users[1] = "Kate"; users[4] = "Sam"; for(let i=0; i
Tom Kate undefined undefined Sam

Несмотря на то, что для индексов 2 и 3 мы не добавляли элементов, но длиной массива в данном случае будет число 5. Просто элементы с индексами 2 и 3 будут иметь значение undefined .

Массивы в Javascript: как создать, методы работы, использование циклов

Для хорошего программиста просто необходимо знание языка Javascript и умение работать с массивами. Здесь мы ознакомимся с понятием массивов. Рассмотрим несколько способов их создания, а также методы работы с массивами. Кроме этого, ознакомимся с таким вопросом, как циклы.

интерактивный курс modern javascript

В чем состоит отличие массива от переменной

Давайте начнем изучение этого вопроса, используя пример, взятый из жизни.

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

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

Учимся создавать массивы

Язык Javascript позволяет создавать массив различными способами.

Рассмотрим первый вариант.

Таким образом, создают массив данных из чисел:

array = [1, 23, 15, 10, 33];

Так создается строчный массив:

array = ["Один", "Два", "Три", "Четыре"];

В этом случае мы создаем массив через объекты.

Программный код имеет такой вид:

array = new Array(1, 23, 15, 10, 33);

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

Учимся обращаться к массиву

Обращаясь к первому элементу надо дать такой запрос:

console.log(array[0])

Функция Console.log показывает содержимое массива

Мы извлекаем первый элемент – array[0].

В JAVASCRIPT порядок отсчета массивов идет от нуля. Следовательно, обращаясь array[0] получаем значение элемента идущего первым - 1. Если массив строковый - Один.

Начинаем работать с массивами

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

Давайте внимательно рассмотрим некоторые из них.

Начнем с REVERSE

Метод REVERSE дает возможность изменить массив и сформировать новый, с элементами, расположенными в обратном порядке.

Рассмотрим на примере:

array = ["Один", "Два", "Три", "Четыре"]; array.reverse();
["Четыре", "Три", "Два", "Один"]

Второй метод CONCAT

Используя метод - CONCAT, мы получаем возможность объединить массив с другим массивом или данным. При его использовании данные исходного массива не изменяются.

array = ["Один", "Два", "Три", "Четыре"]; array.concat(12);

Используем метод, добавляем данные

Что у нас получилось:

["Один", "Два", "Три", "Четыре", 12]

Третий метод SLICE

Используя метод SLICE, мы можем обрезать часть строки. Чтобы это сделать, нужно задать один, при необходимости, два параметра.

В случае если мы зададим -1, метод вернет оставшуюся часть строки с предпоследним элементом.

Смотрим на примере:

array = ["Один", "Два", "Три", "Четыре"]; array.slice(1,-1);

убираем первый и последний элементы

["Два", "Три"]

Следующий метод – SPLICE

Этот метод очень многофункционален.

SPLICE может принять три аргумента:

Первый аргумент — это индекс массива, начиная с которого мы будем удалять элементы;

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

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

Метод splice вносит изменения в исходный массив.

Для понимания смотрим пример:

array = ["Один", "Два", "Три", "Четыре"]; array.splice(1, 2, "2", "3");

индекс, начиная с которого удаляются элементы: 1

количество удаляемых элементов: 2

значения, заменяющие удаленные элементы: "2", "3"

В результате мы получаем:

["Один", "2", "3", "Четыре"]

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

Рассмотрим следующий метод - PUSH

PUSH позволяет вставить элемент в конец массива.

Для наглядности рассмотрим пример:

array = ["Один", "Два", "Три", "Четыре"]; array.push("Пять");
["Один", "Два", "Три", "Четыре", "Пять"]

UNSHIFT - еще один метод требующий внимания

Он похож на метод, рассмотренный выше. В отличие от него UNSHIFT добавляет элемент не в конце, а в начале.

array = ["Один", "Два", "Три", "Четыре"]; array.unshift("Ноль");
["Ноль", "Один", "Два", "Три", "Четыре"] 

Рассмотрим очередной интересный метод - POP

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

Смотрим на пример:

array = ["Один", "Два", "Три", "Четыре"]; array.pop(); 

Полученный результат будет таким:

"Четыре" ["Один", "Два", "Три"]

Следующий метод - SHIFT

Используя метод SHIFT, мы производим подобные действия. Только в этом случае из массива извлекается первый элемент.

Видим на примере:

array = ["Один", "Два", "Три", "Четыре"]; array.shift();

Получаем в результате:

"Один" ["Два", "Три", "Четыре"]

Рассмотрим метод JOIN

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

Давайте посмотрим, как это будет выглядеть, если мы используем разделитель"-":

array = ["Один", "Два", "Три", "Четыре"]; array.join("-");

В итоге у нас получится строка:

Один-Два-Три-Четыре

Изучаем очередной метод – SORT

Используя метод, мы получаем возможность провести сортировку элементов массива в порядке алфавита. У метода большие возможности. С его помощью можно задавать другую логику действий. Он достоин рассмотрения в отдельном материале. Мы просто ознакомимся с ним и посмотрим его работу:

array = ["а", "в", "б", "г"]; array.sort();

Как и ожидалось, получаем элементы:

["а", "б", "в", "г"]

Массивы и циклы

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

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

В Javascript применяются такие циклы

FOR

Это простой цикл, позволяющий перебирать массив.

array = ["Один", "Два", "Три", "Четыре"]; for(i = 0; i

На выходе получим:

Один Два Три Четыре

FOREACH

Это улучшенный цикл, используемый при переборе массива. Он принимает такие элементы: element, index, array.

Рассмотрим возможные варианты его использования.

Первый вариант:

array = ["Один", "Два", "Три", "Четыре"]; array.forEach(function(element, index) < console.log(element); >); 

В результате получаем:

Один Два Три Четыре

Второй вариант:

array = ["Один", "Два", "Три", "Четыре"]; array.forEach(function(element, index, array) < array[index] = element.toUpperCase(); >); console.log(array); 

Применяя метод toUpperCase() на выходе мы получаем все элементы прописанные большими буквами:

["ОДИН", "ДВА", "ТРИ", "ЧЕТЫРЕ"]

Выводы

Кроме рассмотренных нами методов, используемых в Javascript, есть множество других. В одной статье охватить все просто нереально. По мере изучения языка вам будут открываться новые возможности. Умение применять методы, перечисленные в этом материале, позволит вам значительно увеличить свои возможности в программировании. С помощью Javascript создаются уникальные и неповторимые сайты.

Поделитесь в социальных сетях

Массив — JS: Коллекции

Массив — это самая распространенная структура данных во всех языках программирования. В этом уроке мы узнаем, что такое массив и объект, а также подробно разберем встроенные методы для работы с массивами в JavaScript.

Что такое массив

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

Рассмотрим пример массива:

У нас есть массив a , и у него длина n . Он проиндексирован — каждое его значение хранится под определенным номером. Они идут по порядку и начинаются с нуля. Первый индекс всегда нуль — это стандарт.

Последний индекс будет n-1 , так как количество элементов всегда на единицу больше, чем количество индексов.

Чтобы обратиться к элементам, нужно указать его имя и в квадратных скобках — индекс.

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

Определение массива в JavaScript

В JavaScript пустой массив создается с помощью квадратных скобок:

const arr1 = []; 

Если массив инициализируется какими-то значениями, то их нужно указать в квадратных скобках через запятую:

const arr2 = [1, 'string', <>, [3, NaN]]; 

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

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

arr2[0]; // 1 arr2[3]; //[3, NaN] 

В итоге мы получим значения, с которыми можем работать дальше.

Также мы можем запросить элемент, которого нет в массиве. Например, используем индекс 4 :

arr2[4]; // undefined 

У нас нет элемента с таким индексом. В результате мы не получим ошибку. В этом случае в JavaScript мы получаем undefined .

Что такое объект

В работе с массивами в JavaScript есть особенность:

const arr2 = [1, 'string', <>, [3, NaN]]; typeof arr2; // object 

С помощью операции typeof мы смотрим, какой тип у массива. Получаем object .

Дело в том, что когда мы создаем массив, то создается объект. Квадратные скобки заменяют такую конструкцию:

new Array(1, 'string', <>, [3, NaN]); 

Фактически мы создаем новый элемент с типом array , в котором через запятую перечисляем элементы внутри него, и он является объектом.

Array — это подтип объекта, который обладает определенными свойствами. Мы можем обращаться к нему, как к другим объектам. Например, array определяет свойство length , которое возвращает длину этого массива:

// length возвращает длину массива arr2.length; // 4 arr2['length']; // 4 

Свойство length обновляется автоматически. Например, если мы что-то добавляем или удаляем, то оно будет меняться в зависимости от того, что мы делаем.

При этом квадратные скобки при обращении к массиву не являются специфичными для массива. В примере мы обратились к свойству через квадратные скобки arr2['length'] — это работает. Также к свойствам можно обращаться через точку arr2.length . Оба варианта делают одно и то же.

Теперь представим, как бы мы определили массив в терминах объекта. Мы сделали объект, у которого ключи являются числовыми — как индексы:

const obj =  0: 1, 1: 'string', 2: <>, 3: [3, NaN] > console.log(obj[0]); // 1 

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

Если обратиться к нему также через скобки и поставить туда индекс 0, то мы получим единицу. Это работает практически как массив. Массив синтаксически ничего не добавляет кроме конструкции [] , которая заменяет new Array() . Все остальное — это часть типа данных object в JavaScript. Из-за того, что они смешиваются в одну сущность, это добавляет некоторые неожиданные эффекты, с которыми мы познакомимся позже.

В большинстве языков программирования массивы так не пересекаются с объектами, так как являются разными типами данных. Например, в PHP вообще нет массивов, а есть только объекты или так называемые ассоциативные массивы, с которыми мы тоже познакомимся попозже.

Что можно делать с массивом

Рассмотрим манипуляции, которые можно делать с массивом в JavaScript:

  • Обновление
  • Произвольное добавление
  • Последовательное добавление
  • Удаление
  • Добавление и удаление элементов в начале или конце массива
  • Итерация
  • Функции высшего порядка
  • Другие функции

Разберем каждый метод подробнее.

Обновление

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

const arr = [1, 'string', [3, 2]]; arr[0] = 'hello'; arr[0]; // hello arr.length; // 3 

Синтаксис такой же, как и с константами переменными. Мы просто присваиваем новое значение в индекс массива arr[0] = 'hello' . Если мы потом выведем его, то увидим новое значение hello . При этом длина массива не изменилась, так как мы просто заменили значение под индексом 0.

В данном примере используется const , а не let . Мы сохраняем в константе массив, и константа не меняется. Мы всегда работаем через константу с одним и тем же массивом.

При этом JavaScript не гарантирует, что сам массив не будет меняться. Мы можем изменить его добавлением, удалением или заменой каких-то элементов. Но сам массив остается тот же. Поэтому, если у нас не происходит замены всего массива на новый, то нужно всегда использовать const . Это применимо и к другим типам данных.

Напомним, что const пишется один раз при создании массива.

Произвольное добавление

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

const arr = [1, 'string', <>]; arr[5] = 'world' ; 

Здесь мы добавляем значение не в последний индекс. Сейчас их у нас три, а мы добавляем значение world в индекс 5.

В этом случае мы не получим ошибку. Если распечатать массив, то можно увидеть следующее:

console.log(arr); // [1, 'string', <>, , , 'world' ] 

Если мы выведем длину массива, то она будет равна 6:

arr.length; // 6 

Получается, что пустые места — это реальные элементы — чем-то заполнились. Если мы попытаемся вывести на экран значение под индексом 4, то получим undefined :

arr[4]; // undefined 

Сам элемент существует, но его значение равно undefined . Если мы обращаемся к индексу, которого не существует, то тоже получаем undefined .

Получается, что в одном случае индекс с элементом есть, а в другом случае индекса нет. Но мы в любом случае получаем undefined .

Иногда разница в этих значениях есть, и ее нужно учитывать. А иногда ее нет. Главное помнить, что undefined не всегда означает, что этого индекса не существует. Там действительно может лежать значение undefined .

Последовательное добавление

Чтобы добавить что-то в массив, используют метод push :

const arr = [1, 'string', <>]; arr.push(10); 

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

Если распечатать его, то мы получим 10:

arr[3]; // 10 // длина массива увеличивается на единицу: arr.length; // 4 

Это стандартный подход при работе с массивом.

Удаление

При работе с массивами есть механизм удаления элемента, но он работает не так, как ожидается:

// Создаем массив const arr = [1, 'string', <>]; // Используем специальную конструкцию delete, в которой передаем элемент массива с индексом delete arr[1]; // Длина массива не изменилась arr.length; // 3 // Элемент стал undefined arr[1]; // undefined 

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

Если распечатать, то увидим пропущенное значение:

console.log(arr); // [ 1, , <> ] 

Удалять что-то из массива — это плохая практика, которая может приводить к проблемам. О них мы поговорим позже. Поэтому так не стоит делать.

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

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

Чтобы добавить или удалить элементы в начало или конец массива, используются методы shift , unshift , pop и push . Эта группа методов позволяет работать с массивом как с очередью — метод доступа FIFO, или стеком — метод доступа LIFO. Рассмотрим это на примере:

// Инициализируем демонстрационный массив const planets = ['Mercury', 'Venus', 'Earth', 'Mars']; 

Очередь является упорядоченным набором данных, организованным по принципу FIFO — first in — first out. То есть элементы всегда добавляются в конец очереди, а удаляются из ее начала:

// push добавляет один или несколько элементов в конец массива // и возвращает длину измененного (мутированного) массива // (если точнее, то метод возвращает обновленное свойство length массива, // которое является значением последнего индекса, увеличенным на единицу) planets.push('Jupiter'); // 5 planets.push('Saturn', 'Uranus'); // 7 console.log(planets); // => [ 'Mercury', 'Venus', 'Earth', 'Mars', 'Jupiter', 'Saturn', 'Uranus' ] // shift удаляет первый элемент массива и возвращает его значение planets.shift(); // удалили элемент из начала массива, возвращаемое значение: 'Mercury' planets.shift(); // еще раз удалили элемент из начала массива, возвращаемое значение: 'Venus' console.log(planets); // => [ 'Earth', 'Mars', 'Jupiter', 'Saturn', 'Uranus' ] 

Стек является упорядоченным набором данных, организованным по принципу LIFO — last in — first out. То есть элементы добавляются и удаляются всегда из конца такой коллекции:

// Добавим элемент в конец массива уже известным нам способом planets.push('Neptune'); // 6 console.log(planets); // => [ 'Earth', 'Mars', 'Jupiter', 'Saturn', 'Uranus', 'Neptune' ] // pop удаляет последний элемент массива и возвращает его значение planets.pop(); // 'Neptune' planets.pop(); // 'Uranus' console.log(planets); // => [ 'Earth', 'Mars', 'Jupiter', 'Saturn' ] 

Итерация

Классический способ итерации для императивных языков — это цикл. В JavaScript много циклов, для работы с массивами часто применяется for…of :

const iterable = [10, 20, 30]; for (const value of iterable)  // В value каждый раз оказывается текущее значение по порядку console.log(value); > // 10 // 20 // 30 

Функции высшего порядка

Канонический способ работы с коллекциями в JavaScript — функции высшего порядка.

Представим, что у нас есть массив numbers :

const numbers = [1, 4, 9]; 

Мы хотим выполнить с ним стандартные операции: map , filter , reduce и reduceRight :

Пример работы с map :

const roots = numbers.map((value) => Math.sqrt(value)); // Передаем в map анонимную функцию, внутри которой вызываем `Math.sqrt()` и передаем в него текущее значение из списка `value` console.log(roots); // [1, 2, 3] 
const roots = numbers.map(Math.sqrt); console.log(roots); // [1, 2, 3] 

В JavaScript все функции являются объектами первого рода, и мы можем их передавать как аргументы. Во втором примере мы вызываем метод map на массиве numbers и передаем туда саму функцию Math.sqrt() , так как она принимает тот же параметр, что и наша функция-обертка.

В итоге получаются корни — roots . Если их распечатать, у нас появляется 1, 2, 3.

Следующий пример — это фильтрация:

// Передаем анонимную функцию, которая выбирает элементы больше 3 const filtered = numbers.filter(n => n > 3); console.log(filtered); // [4, 9] 

Если мы распечатаем получившийся массив, то получим 4,9, так как у нас единица меньше 3, она сюда не попадает.

Наиболее комплексный пример из функций высшего порядка — это reduce :

const sum = numbers.reduce( // reduce принимает на вход два параметра. Первый — анонимная функция (acc, value, index, arr) => acc + value, // Второй параметр — начальный счетчик. В данном случае мы находим сумму, поэтому начальный счетчик равен нулю 0 ); console.log(sum); // 14 

В итоге возвращаем тело функции в преобразованный новый аккумулятор и считаем сумму элементов массива. Если его распечатать, то получаем 14.

У анонимной функции достаточно много параметров. В JavaScript это сделано для удобства. Чаще всего используются только первые два параметра. Список параметров:

  • acc — аккумулятор
  • value — значение текущего, которое обрабатывается
  • index — индекс, что может быть полезно в определенных случаях
  • arr — сам массив

Пример работы с reduceRight :

// reduceRight — зеркальное отражение reduce, осуществляет свертку, обрабатывая элементы справа налево const planets = ['Меркурий', 'Венера', 'Земля', 'Марс']; const closer = planets.reduceRight((acc, planet) => `$acc> $planet>`, 'всё ближе к Солнцу:'); // 'всё ближе к Солнцу: Марс Земля Венера Меркурий' const further = planets.reduce((acc, planet) => `$acc> $planet>`, 'всё дальше от Солнца:'); // 'всё дальше от Солнца: Меркурий Венера Земля Марс' 

Другие функции

Чтобы строки превратить в массив, а также сделать обратное, используют split и join :

const planets = 'Mercury,Venus,Earth,Mars'; console.log(planets.split(',')); // => [ 'Mercury', 'Venus', 'Earth', 'Mars' ] console.log(planets.split(',').join('-')); // => 'Mercury-Venus-Earth-Mars' 

Поиск в массиве и проверка соблюдения условий элементами массива производится с помощью find , findIndex , indexOf , lastIndexOf , some , every , includes и так далее. Например:

// includes определяет наличие элемента в массиве, возвращая true/false const planets = ['Mercury', 'Venus', 'Earth', 'Mars']; planets.includes('Earth'); // true planets.includes('Earth', 3); // ищет с третьей индексной позиции, поэтому false planets.includes('Saturn'); // false 

Сортировка массива происходит с помощью sort , reverse .

const planets = ['Mercury', 'Venus', 'Earth', 'Mars'] planets.sort(); // ['Earth', 'Mars', 'Mercury', 'Venus'] planets.reverse(); // ['Venus', 'Mercury', 'Mars', 'Earth'] 

Разберем еще один метод flat() . Он делает содержимое вложенных элементов-массивов исходного массива элементами самого исходного массива. Он словно выравнивает массив. Посмотрим на код:

const arr = [1, 2, [1.1, 1.2, [2.1, [3.1, 3.2]]], 3]; // метод не изменяет исходный массив, а возвращает новый, поэтому результат присваиваем в новую переменную const flattenArr = arr.flat(); console.log(flattenArr); // => [1, 2, 1.1, 1.2, [2.1, [3.1, 3.2]], 3] 

Как видно из предыдущего примера, нам удалось выровнять все элементы на один уровень ниже лежащих массивов. При этом элементы более глубоко лежащих массивов остались невыровненными.

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

console.log(arr.flat(1)); // => [1, 2, 1.1, 1.2, [2.1, [3.1, 3.2]], 3] console.log(arr.flat(2)); // => [1, 2, 1.1, 1.2, 2.1, [3.1, 3.2], 3] console.log(arr.flat(3)); // => [1, 2, 1.1, 1.2, 2.1, 3.1, 3.2, 3] Для полного выравнивания нужно передать в параметр `Infinity`: ```javascript const flattenDeepArr = arr.flat(Infinity); console.log(flattenDeepArr); // => [1, 2, 1.1, 1.2, 2.1, 3.1, 3.2, 3] 

Библиотека lodash

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

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

Изменяемость VS Неизменяемость

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

Например, большинство примененных к массиву функций высшего порядка результатом возвращают новый массив. При этом они оставляют исходный нетронутым. Метод sort , как сказано в документации , необратимым образом модифицирует исходный массив. Поэтому такую сортировку лучше сделать на копии массива, если нам не нужно, чтобы исходный массив менялся.

Возьмем для примера типичную ситуацию, когда необходимо добавить новый элемент в массив. Рассмотрим, как справиться с этой задачей на примeре изменяющего метода push и неизменяющего concat :

push

const colours = ['red', 'orange', 'yellow']; colours.push('green'); // возвращаемое значение: 4 console.log(colours); // теперь colours - [ 'red', 'orange', 'yellow', 'green' ] 

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

concat

const colours = ['red', 'orange', 'yellow']; const myFavColours = colours.concat('green'); console.log(colours); // colours остался неизменен — [ 'red', 'orange', 'yellow' ] console.log(myFavColours); // новый массив myFavColours — [ 'red', 'orange', 'yellow', 'green' ] // аргументом можно передать и массив значений console.log(myFavColours.concat(myFavColours)); // => [ 'red', 'orange', 'yellow', 'green', 'red', 'orange', 'yellow', 'green' ] 

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

Выводы

В этом уроке мы узнали, что такое массив. Это структура данных, которая содержит упорядоченный набор элементов и предоставляет произвольный доступ к своим элементам. Также мы рассмотрели манипуляции, которые можно делать с массивом в JavaScript. К ним относятся:

  • Обновление
  • Произвольное добавление
  • Последовательное добавление
  • Удаление
  • Добавление и удаление элементов в начале или конце массива

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов

Наши выпускники работают в компаниях:

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

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