Массивы и объекты в JavaScript как книги и газеты — Блог HTML Academy
Это перевод статьи Кевина Кононенко «JavaScript Arrays and Objects Are Just Like».
Если вы читали книги и газеты, то легко поймёте разницу между объектами и массивами в JavaScript.
В начале изучения JavaScript можно легко запутаться в способах хранения данных. С одной стороны, массивы могут быть знакомы вам благодаря циклу for
. Но, по мере того, как вы будете заполнять массив данными, код может стать всё менее поддерживаемым.
Выбор между объектом и массивом станет проще, если представлять себе зачем нужна та или иная структура. Массивы подобны книгам, в которых содержится та или иная информация, а объекты похожи на газету.
Разберёмся с этим.
Массивы: порядок данных очень важен
Взглянем на нашу небольшую книгу, если бы она была массивом:
var book = [`foreword`, `boyWhoLived`, `vanishingGlass`, `lettersFromNoOne`, `afterword`];
Кстати, обратите внимание — это первые три главы книги «Гарри Поттер и философский камень». И вот как можно визуализировать их:
Использовать массивы нужно тогда, когда последовательность информации имеет большое значение.
Надеюсь, что никто не глядит на оглавление книги и не думает: «Хм, эта глава выглядит интересной, пожалуй начну с неё». Порядок глав в книге указывает, как её нужно читать.
Когда нужно перебрать массив, то используется номер для каждого элемента массива. Массивы — это структуры данных, где нумерация начинается с нуля, поэтому мы начинаем в них отсчёт с 0, а не 1.
Так что, если вы хотите получить доступ к первому элементу массива, то пишите так:
book[0]
И вот что получите:
`foreword`
Если нужна третья глава, то напишите так:
book[2]
Вы читаете книгу, основываясь на порядке глав в книге, а не по названию этих глав.
Объекты: заголовок имеет значение
Посмотрите как бы выглядела газета в виде объекта:
var newspaper = { sports: `ARod Hits Home Run`, business: `GE Stock Dips Again`, movies: `Superman Is A Flop` }
А вот так можно визуализировать её:
Объекты — лучший выбор если вы хотите структурировать информацию по названию данных.
Читая газету, мы не обязаны читать её «от корки до корки». Можно начать чтение с любого интересного для вас раздела. Неважно, где именно этот раздел находится в газете, контекст сохраняется. Это и отличает газету от книги, где важна строгая последовательность чтения глав.
Объекты хранят информацию в виде пары ключ-значение. Вот как это выглядит:
key: value
Если хотите начать читать газету с новостей бизнеса, то использовать следует такой ключ:
newspaper[`business`]
Или такой:
newspaper.business
Это вернёт нам значение: GE Stock Dips Again Поэтому когда легче получить доступ к данным на основании их имён (ключа), то вам необходимо хранить эти данные в виде объекта.
Объединяем объекты и массивы
В примерах выше в наших массивах и объектах мы хранили только строки. Но можно хранить и другие структуры данных, такие как числа или булевы значения, а также:
- Массивы внутри объектов.
- Объекты внутри массивов.
- Массивы внутри массивов.
- Объекты внутри объектов.
Это начинает становиться сложным. Но вам всегда нужна будет комбинация из двух типов для лучшей масштабируемости данных. Вы же хотите разобраться в коде спустя время, когда нужно будет что-то в нём исправить?
Давайте снова возьмём книгу, как пример. Что если мы хотим также хранить и количество страниц в каждой главе? В таком случае стоит заполнить наш массив объектами:
var book = [ [`foreword`, 14], [`boywholived`, 18] ]
var book = [ {name:`foreword`, pageCount: 14}, {name:`boyWhoLived`, pageCount: 18}, {name:`vanishingGlass`, pageCount: 13}, {name:`lettersFromNoOne`, pageCount: 17}, {name:`afterword`, pageCount: 19} ];
Таким образом, мы сохранили порядок глав и в то же время разные свойства для каждой главы. Например, если захотите узнать сколько страниц во второй главе, то можете написать:
book[1][`pageCount`]
В результате мы увидим, что в книге будет 18 страниц.
Теперь давайте представим, что нам нужен топ-писателей для каждой колонки новостей в газете. Можно быстро сделать это с помощью массива внутри объекта:
var newspaper = { sports: `ARod Hits Home Run`, sportsWriters: [`Miramon Nuevo`, `Rick Reilly`, `Woddy Paige`], business: `GE Stock Dips Again`, businessWriters: [`Adam Smith`, `Albert Humphrey`, `Charles Handy`], movies: `Superman Is A Flop`, moviesWriters: [`Rogert Ebert`, `Andrew Sarris`, `Wesley Morris`] }
Массив отлично подходит для хранения информации о рейтинге писателей, поскольку в массиве порядок имеет значение. Вы знаете, что старые авторы оцениваются выше, чем новые и это характерно для каждого массива. Писатель с номером 0 будет топ-писателем.
Можно оптимизировать этот объект, просто создав объект внутри нашего объекта newspaper
. Например, объект sports
с заголовком и списком писателей. Но теперь я хочу, чтобы вы сами попробовали.
Как обратиться к элементу массива? — efim360.ru
Обращение к любому элементу массива осуществляется при помощи квадратных скобок и целочисленного значения индекса элемента.
Очень часто в программировании на JavaScript нужно получать первый элемент массива или последний элемент массива. Это популярные задачи т. к. на них работает большое количество логики алгоритмов.
Но как обратиться к любому элементу массива? Например, как дотянуться до значения элемента между первым и последним?
Видео инструкция
В этом видео приводится пример обращения к элементу массива JavaScript. Массив создан при помощи квадратных скобок. Ввод команд осуществляется в консоль браузера Google Chrome. Результат виден сразу.
Сложность 0 — однородные одноуровневые элементы
У нас есть полный массив из строковых элементов:
var massiv = ["ффф","ыыы","ввв","ааа","ппп","ррр","ооо","ллл"]
Как нам получить «ппп»? Значение «ппп» находится под индексом 4. Обращение к элементу будет выглядеть так:
massiv[4]
Сложность 1 — многоуровневый массив
Массив со смешанными данными и разными уровнями вложенности:
var massiv1 = [["ввв","ааа"],["ффф","ыыы",[456,522,[89,"qwerty"],25,878]],["ппп",["ррр","ооо"],"ллл"]]
Как получить значение «qwerty»? Для начала найдём элементы первого уровня вложенности (самый верхний уровень). Раскидаем элементы построчно.
Массив massiv1 состоит из трёх элементов:
[ ["ввв","ааа"], ["ффф","ыыы",[456,522,[89,"qwerty"],25,878]], ["ппп",["ррр","ооо"],"ллл"] ]
Искомое «qwerty» находится во втором элементе. Обратимся ко второму элементу основного массива при помощи индекса 1:
massiv1[1]
Эта команда вернёт нам массив т. к. второй элемент основного массива также является массивом — (уровень 2):
["ффф","ыыы",[456,522,[89,"qwerty"],25,878]]
В этом массиве нам нужно обратиться уже к третьему элементу — это индекс 2. То есть к первой команде massiv1[1] нам нужно добавить новую команду [2]:
massiv1[1][2]
Эта команда вернёт нам массив т. к. третий элемент массива уровня 2 также является массивом — (уровень 3):
[456,522,[89,"qwerty"],25,878]
В этом массиве нам нужно обратиться тоже к третьему элементу — это индекс 2. То есть к первой команде massiv1[1] нам нужно добавить вторую команду [2], и третью — [2]:
massiv1[1][2][2]
Эта команда вернёт нам массив т. к. третий элемент массива уровня 3 также является массивом — (уровень 4):
[89,"qwerty"]
В этом массиве нам нужно обратиться ко второму элементу — это индекс 1. То есть к первой команде massiv1[1] нам нужно добавить вторую команду [2], третью — [2] и четвёртую [1]:
massiv1[1][2][2][1]
Итоговый результат:
"qwerty"
Сложность 2
У нас есть полный массив из всевозможных элементов:
var massiv2 = [["ффф","ыыы",[456,522,[89,"qwerty"],25,878]],[[false],"ввв","ааа"],{x2:true, rr11:[2010], KdvwQs:["sdfiyhHIYgRFrsD",true,{qwerty:{sdsd:"ASDF", de54:["efim360.ru"]}}], lk:false},["ппп",{},["ррр","ооо"],"ллл"]]
Массив massiv2 состоит из 4 элементов:
[ ["ффф","ыыы",[456,522,[89,"qwerty"],25,878]], [[false],"ввв","ааа"], {x2:true, rr11:[2010], KdvwQs:["sdfiyhHIYgRFrsD",true,{qwerty:{sdsd:"ASDF", de54:["efim360.ru"]}}], lk:false}, ["ппп",{},["ррр","ооо"],"ллл"] ]
Как нам получить строку «efim360.ru»? Из прошлой сложности вам должно быть понятно описание, поэтому в этом примере затронем вопрос обращения к элементам объекта.
Получаем третий элемент основного массива в котором находится объект:
massiv2[2]
{x2:true, rr11:[2010], KdvwQs:["sdfiyhHIYgRFrsD",true,{qwerty:{sdsd:"ASDF", de54:["efim360.ru"]}}], lk:false}
Из объекта достаём массив:
massiv2[2].KdvwQs
В объектах мы обращаемся к значениям элементов по его ключам (по аналогии с индексами массивов). Сначала мы ставим точку, а потом дописываем нужное имя ключа из которого будем получать значение.
Получаем массив:
["sdfiyhHIYgRFrsD",true,{qwerty:{sdsd:"ASDF", de54:["efim360.ru"]}}]
Достаём из него последний элемент — нашем случае он третий, значит индекс равен 2:
massiv2[2].KdvwQs[2]
Получаем объект, который состоит из одного элемента (одной пары «ключ/значение»):
{qwerty:{sdsd:"ASDF", de54:["efim360.ru"]}}
Достаём значение единственного элемента по его ключу — qwerty:
massiv2[2].KdvwQs[2].qwerty
Снова получаем объект:
{sdsd:"ASDF", de54:["efim360.ru"]}
Вытаскиваем значение второго элемента объекта:
massiv2[2].KdvwQs[2].qwerty.de54
Нам возвращается массив из одного элемента со строковым значением — искомым значением:
["efim360.ru"]
Достаём строку из массива:
massiv2[2].KdvwQs[2].qwerty.de54[0]
Получаем нужную нам строку:
"efim360.ru"
Итоговая картинка сложности 2:
Получение строки efim360.ru из массива
Ссылки
JavaScript | Массивы (Array)
JavaScript | Как получить первый элемент массива?
JavaScript | Как получить последний элемент массива?
JavaScript | Как изменить длину массива?
JavaScript | Как увеличить длину массива?
JavaScript | Как уменьшить длину массива?
ECMAScript — Living Standard — https://tc39. es/ecma262/#sec-array-objects
Написание цикла for…of в JavaScript
В этом руководстве мы покажем вам, как написать и использовать цикл for…of в JavaScript.
В JavaScript цикл for…of позволяет перебирать значения, хранящиеся в итерируемом объекте.
Эти итерируемые объекты включают в себя массивы, наборы, строки, карты, списки узлов и т. д. Кроме того, любой объект может реализовать повторяемый протокол, который этот цикл будет использовать для обработки своих данных.
Цикл for…of — относительно новое дополнение к языку JavaScript, реализованному в ES6. Однако этот тип цикла поддерживается всеми основными веб-браузерами.
По сравнению с циклом for и for…in JavaScript лучше всего использовать его для перебора значений, хранящихся в таких объектах, как массивы.
В следующих нескольких разделах мы покажем вам, как написать и использовать цикл for…in в JavaScript.
Синтаксис цикла for…of в JavaScript
Давайте рассмотрим, как написать цикл for…in в языке JavaScript.
Этот цикл всегда начинается с указания ключевого слова « вместо
», за которым следуют две скобки ( ( )
). В этих скобках вам нужно будет указать следующие данные.
- Сначала необходимо указать переменную, в которой будет храниться значение для текущего цикла. Затем при каждом повторении цикла значение этой переменной будет обновляться.
Вы можете объявить эту переменную, используя ключевые слова «
var
», «let
» или «const
». - Далее, чтобы определить это как цикл for… in, вам нужно будет использовать ключевое слово «
из
».Написание «
из
» сообщает компилятору JavaScript, как ему нужно обрабатывать итерации по указанному объекту. - Наконец, последний элемент, который нужно заключить в скобки, — это объект, который вы хотите перебрать.
Пока объект поддерживает итеративный протокол, он будет зацикливаться.
Ниже вы можете увидеть, как базовый цикл for…in написан в JavaScript.
Примеры использования цикла for…of в JavaScript
Теперь, когда мы показали вам синтаксис цикла for…in, давайте рассмотрим, как его использовать в JavaScript.
В следующих разделах мы рассмотрим несколько различных способов использования этого типа цикла.
Перебор массива с использованием цикла for…of в JavaScript
Одно из лучших применений цикла for…of в JavaScript — перебор массива. Это делает итерацию по массиву невероятно простой.
В этом примере мы начинаем с создания постоянной ( const
) переменной с именем « фруктов
». Внутри этой переменной мы будем хранить массив, содержащий следующие строки: «Яблоко»
, «Банан»
и «Канталупа»
.
Далее мы создаем цикл for…of. Здесь мы используем « фруктов
» в качестве переменной, которая будет содержать текущее значение цикла. Если вы хотите изменить значение, вам нужно будет определить переменную, используя « let
» вместо « const
».
Затем мы используем ключевое слово « из
», за которым следует массив, который мы хотим повторить, в нашем случае это « фруктов
».
В каждом цикле мы используем « console.log()
» для регистрации значения, которое в данный момент находится в переменной « fruit
».
После запуска приведенного выше примера вы можете увидеть, как цикл JavaScript for…of проходит через каждое из трех значений.
Использование цикла for…of для строк
Цикл for…of можно использовать для перебора строки, поскольку они являются итерируемым объектом в JavaScript.
Этот пример покажет вам, как можно использовать цикл for…of для перебора строки. Это в основном то же самое, что и при обработке массива.
Мы начинаем этот пример с объявления строки с именем « pimylifeup
» и присвоения ее переменной с именем « example_string
». Поскольку мы не планируем изменять эту строку, мы объявляем ее с помощью « const
».
Здесь мы используем цикл for…of для перебора переменной « example_string
». JavaScript будет назначать символ из этой строки нашей переменной « символ
» в каждом цикле.
Чтобы продемонстрировать зацикливание JavaScript на вашей строке, мы используем « console.log()
”функция для вывода значения в каждом цикле.
Когда вы запустите приведенный выше пример JavaScript, вы должны получить результат, похожий на то, что мы показали ниже.
Использование цикла for…of для перебора набора
Набор — это еще один объект, который можно перебирать в языке JavaScript с помощью цикла for…of. «Набор
» — это объект, который обеспечивает существование только уникальных элементов.
Начните пример с создания переменной с именем « example_set
» и присвоение ему нового набора с данными [1,1,2,2,3,3]
.
Затем мы используем цикл for…of для перебора нашего « example_set
». Наконец, мы используем « console.log()
» для вывода каждого элемента в наборе в каждом цикле.
В приведенном выше примере вы должны получить следующий результат, напечатанный в командной строке. Поскольку это набор, будут выведены только уникальные записи.
Перебор карты с помощью цикла for…of в JavaScript
Цикл for…of также можно использовать для перебора карты JavaScript. Объект карты содержит пары ключ-значение, поэтому вам нужно будет обрабатывать это немного по-другому, используя функциональные возможности деструктурирования JavaScript.
Начните этот пример кода, объявив карту с некоторыми простыми примерными данными, как показано ниже.
В этом примере мы будем использовать два цикла for…of, чтобы показать вам, как можно структурировать и деструктировать данные.
В первом цикле мы перебираем « example_map
” переменная без деструктурирования данных. Это означает, что в каждом цикле вы будете получать сопоставленные данные целиком, а не как отдельный ключ и значение.
Наш второй цикл изменяет это, используя способность JavaScript распаковывать структуру данных. Используя квадратные скобки ( [ ]
) и указав наши « ключ
» и « значение
», JavaScript распаковывает карту в эти два значения.
Для обоих наших циклов мы будем регистрировать все значения, которые мы получаем в этом цикле
В приведенном ниже выводе вы можете увидеть два разных типа данных, созданных двумя циклами for…of.
Как использовать цикл for…of для генераторов
В JavaScript генераторы — это итерируемые объекты, поэтому вы можете использовать цикл for…of для их повторения.
Для этого примера мы напишем невероятно простой генератор с именем « sampleGenerator()
». Это определяется с помощью « функция
», за которой сразу следуют звездочки ( *
), затем имя функции.
При этом мы просто получим 1, 2 и 3. Эти значения будут распечатаны при повторении генератора.
Мы используем цикл for…of для перебора этого генератора. Использование o в качестве имени нашей переменной, затем использование вызова генератора в качестве «итерируемого объекта».
В каждом цикле функция « console.log()
» используется для вывода текущего значения.
Ниже вы можете увидеть результат, который мы получили, перебирая наш « SampleGenerator()
«.
Заключение
В этом уроке мы показали вам, как использовать цикл for…of в JavaScript. Это мощный цикл, который полезен всякий раз, когда вам нужно перебирать данные.
Этот цикл является одним из лучших способов перебора значений, хранящихся в массиве.
Если у вас есть какие-либо вопросы об использовании цикла for…of, оставьте комментарий ниже.
Обязательно ознакомьтесь со многими другими нашими руководствами по JavaScript и другими нашими руководствами по программированию.
Как безопасно перебирать массивы и объекты в JavaScript — объяснение неизменяемости
В этом руководстве вы узнаете, как перебирать набор массивов и объектов в Javascript. Понимание того, как лучше всего перебирать коллекции, является ключевым навыком при создании надежных веб-приложений. В любом современном веб-приложении вызов API для получения некоторых данных, а затем анализ этих данных в значительной степени является веб-разработкой 101 в наши дни. При выполнении этих задач вам нужно будет перебрать множество коллекций. Незнание наиболее оптимального способа анализа этих данных может привести к неисчислимому количеству ошибок и проблем в вашей кодовой базе, поэтому это важно ⚠️⚠️⚠️
Если вы новичок в программировании, вам необходимо освоить одну действительно важную концепцию — концепцию неизменяемых коллекций. Хорошей практикой является никогда не изменять исходную коллекцию, с которой вы работаете. Если вам нужно отфильтровать или изменить коллекцию, а не исходную коллекцию, рекомендуется сохранить изменения в новом массиве. Если вы новичок в программировании, эта концепция может показаться странной. Многим программистам нравится писать «чистый код», и создание новой коллекции, когда в ней нет необходимости, может рассматриваться как расточительное или даже контрпродуктивное
Причина, по которой вам не следует изменять коллекцию (причудливое слово для модификации), заключается в том, что это значительно снижает вероятность появления ошибок. Когда вы создаете новую коллекцию, это также упрощает написание ваших модульных тестов. Если вы мутируете свою коллекцию во время выполнения, может быть очень сложно попытаться обнаружить ошибки. Если вы хотите узнать немного больше об этой концепции, я предлагаю вам прочитать эту статью для получения дополнительной информации.
Массивы
Итерация по массиву — наиболее распространенный способ работы с коллекциями данных. Вы можете сказать, когда вы работаете с массивом в JSON, так как он будет заключен в квадратные скобки, например []
. Javascript предоставляет множество способов итерации и работы с массивами, можно использовать такие функции, как map()
, push()
, filter()
и slicer()
. Некоторые из этих встроенных функций изменят существующую коллекцию, а другие — нет. Мы знаем, что не хотим изменять существующую коллекцию, так какие из них мы должны использовать?
При переборе коллекций map()
, filter()
и reduce()
все в безопасности. При работе с коллекциями старайтесь отдавать предпочтение этим трем, так как это приведет к более безопасному коду. Понимание этих трех функций является важным шагом на пути к написанию чистого функционального кода.
Используя эти три метода, вы можете делать практически все, что вам нужно. Чтобы стать Javascript 🥷, вам нужно освоить все три!
Объекты
Иногда вам может понадобиться иметь дело с набором объектов, а не набором массивов, например:
При работе с объектом нельзя использовать методы массива. Вместо этого вам нужно использовать object.keys
, чтобы получить имя каждого возражения в коллекции. После того, как у вас есть все ключей
в коллекции, вы можете выполнить forEach()
, используя ключ, чтобы получить нужные вам данные. Этого можно добиться следующим образом:
При работе с объектами вы всегда должны использовать оператор распространения, чтобы гарантировать, что вы не модифицируете исходный элемент.