- Коллекции
- Словари
- Тип Map
- Тип WeakMap
- Коллекции
- Тип Set
- Преобразования между Array и Set
- Сравнение Array и Set
- Тип WeakSet
- Проверка на равенство в Map и Set
- Found a content problem with this page?
- Как создавать словари в JavaScript
- Создание словаря в JavaScript
- Как добавить значения в словарь
- Как получить доступ к ключам
- Итерация по словарям
- О чем следует помнить
- JavaScript Basics: How to create a Dictionary with Key/Value pairs
- Creating a Dictionary in JavaScript
- Iterating Key/Value Pairs
- Access Key/Value Pairs Directly
- Functions can be Key or Value Too!
Коллекции
Этот раздел содержит обзор коллекций Set и словарей Map (en-US) — встроенных структур данных с доступом по ключу.
Словари
Тип Map
Map (en-US) — реализация простого ассоциативного массива (словаря). Он содержит данные в виде набора пар ключ/значение(ключи уникальны) и предоставляет методы для доступа и манипулирования этими данными.
Также как и объект, словарь позволяет
- получать значение по ключу, а также проверять наличие ключа
- добавлять/удалять пары ключ/значение
- перезаписывать значение по ключу (ключи уникальны).
- итерироваться по ключам
Словари, как специализированная структура данных, имеют существенные преимущества по сравнению с объектами:
- Ключи словаря могут быть любого типа (а не только строки).
- Словарь хранит свой размер (не надо вычислять).
- Натуральный порядок обхода элементов ( в порядке добавления) с помощью for. of .
- Словарь не подмешивает ключи из прототипа (в отличие от объекта).
В следующем примере приведены основные операции со словарём:
var sayings = new Map(); sayings.set("dog", "woof"); sayings.set("cat", "meow").set("elephant", "toot"); //вызов функции .set возвращает Map, поэтому set можно объединять в цепочки sayings.set("dog", "гав-гав"); // заменить значение по ключу sayings.size; // 3 sayings.get("fox"); // undefined sayings.has("bird"); // false sayings.delete("dog"); for (var [key, value] of sayings) console.log(key + " goes " + value); > // "cat goes meow" // "elephant goes toot"
Больше примеров и полное описание на странице справочника Map (en-US) .
Тип WeakMap
WeakMap это специальный вид словаря, ключами которого могут быть только объекты, причём ссылки на них в WeakMap являются слабыми (не учитываются сборщиком мусора (garbage collector GC)).
Примечание: Интерфейс WeakMap совпадает с Map , единственное отличие — ключи WeakMap нельзя итерировать (т.e. нельзя получить список ключей). Это понятно, поскольку в таком случае возникла бы неопределённость с достоверностью этого списка в зависимости от состояния garbage collection.
Больше примеров, полное описание, а также обсуждение «Зачем WeakMap?» на странице справочника WeakMap .
Отметим, что WeakMap, в частности, может элегантно использоваться для упаковки приватных данных или деталей реализации. Следующий пример из статьи Nick Fitzgerald «Hiding Implementation Details with ECMAScript 6 WeakMaps». Приватная часть сохраняется как значение в privates и имеет время жизни такое же как и сущность класса. Сам класс и его методы публичны; прочее недоступно извне модуля:
const privates = new WeakMap(); export class Public() constructor() const me = // Приватные данные идут здесь >; // 'me' будет освобождён вместе с 'this' . privates.set(this, me); > method () const me = privates.get(this); // Сделайте что-нибудь с приватными данными в 'me'. > >
Коллекции
Тип Set
Set реализация коллекции — структура данных, которая содержит список уникальных элементов в порядке их добавления.
В следующем примере приведены основные операции по работе с коллекцией Set:
var mySet = new Set(); mySet.add(1); mySet.add("some text"); mySet.add("foo"); mySet.has(1); // true mySet.delete("foo"); mySet.size; // 2 for (let item of mySet) console.log(item); // 1 // "some text"
Больше примеров и полное описание на странице справочника Set
Преобразования между Array и Set
Можно создать Array из Set с помощью Array.from или используя spread operator.
В свою очередь, конструктор Set может принимать Array в качестве аргумента.
Примечание: Поскольку Set структура работает с уникальными значениями, любые повторяющиеся элементы из Array будут проигнорированы.
.from(mySet); [. mySet2]; mySet2 = new Set([1,2,3,4]);
Сравнение Array и Set
Словари, как специализированная структура данных, имеют существенные отличия по сравнению с массивами:
- Set.has работает быстрее чем Array.indexOf .
- можно удалять элементы по значению (а не по индексу как массивах).
- NaN обрабатывается корректно.
- поддерживается уникальность значений.
Тип WeakSet
WeakSet это специальный вид коллекции, элементами которой могут быть только объекты. Ссылки на эти объекты в WeakSet являются слабыми (не учитываются сборщиком мусора (garbage collector GC)).
Примечание: Элементы WeakSet уникальны и могут быть добавлены только один раз, также как и в Set .
- WeakSet это коллекция объектов ( примитивные значения не могут быть добавлены).
- WeakSet нельзя итерировать. А также нельзя получить список (итератор) элементов.
Использование WeakSet достаточно специфическое. Пользуясь тем, что они не могут создавать утечек памяти, в них можно, например, безопасно помещать ссылки на DOM-элементы.
Больше примеров и полное описание на странице справочника WeakSet
Проверка на равенство в Map и Set
Сравнение на равенство ключей в Map objects или объектов в Set основано на «same-value-zero algorithm»:
- алгоритм сравнения в целом совпадает с оператором === .
- -0 и +0 считаются равными (в отличие от === ).
- NaN считается равным самому себе (в отличие от === ).
- « Предыдущая статья
- Следующая статья »
Found a content problem with this page?
This page was last modified on 7 нояб. 2022 г. by MDN contributors.
Your blueprint for a better internet.
Как создавать словари в JavaScript
В языках программирования для хранения данных в парах ключ-значение часто используется общая структура данных, называемая словарем. Он обеспечивает гибкий способ хранения и чтения данных, когда они сопровождаются ключом.
Однако, в отличие от статически типизированных языков, в JavaScript нет такого типа, как Dictionary. Как же его создать? У вас есть несколько вариантов.
Создание словаря в JavaScript
В JavaScript словари можно создавать с помощью Objects. Для создания нового объекта, среди многих других вариантов, можно использовать эти два:
// Using the built-in Object const obj = new Object(); // Using object literals const obj = < key: 'value' >;
Чаще всего используются литералы объектов. Если вам интересно узнать, каковы другие способы создания объектов, посмотрите учебник
Как добавить значения в словарь
Чтобы добавить значения в словарь — или объект JavaScript, — вы можете инициализировать его необходимыми парами ключ-значение, как в предыдущем примере:
// Add default values during initialization const dictionary = < PUBLIC_API_KEY: '1c6aa69fb9d27cb4f29c81611d0b1ff5', PRIVATE_API_KEY: '4fa758e6d388593f8637da4bdd697ef6' >;
Чтобы позже заполнить его дополнительными значениями, вы можете использовать индексы, скобочную нотацию или просто вызвать свойство напрямую с помощью точечной нотации:
// Using an index dictionary[2] = 'c8b0c9e9b1618b4fb35c47ed4e2fadc7'; // Using bracket notation dictionary['blue-book'] = '. '; // Calling the property directly with dot notation dictionary.book = '. ';
Если теперь вы попытаетесь выйти из dictionary в консоль, то получите следующий результат:
Обратите внимание, что в обозначении скобок можно также использовать тире. Это не относится к другим параметрам. Если вы попытаетесь задать его через точечную нотацию, то получите ошибку.
У вас также есть возможность использовать другие переменные в качестве имени для ключей в словаре, используя скобочную нотацию. Просто передайте переменную между скобками.
Обратите внимание, что обозначения скобок внутри объектов доступны только в ES6 и выше:
const key = 'blue-book'; const dictionary = < Словарь в словаре javascript: '. ' >; // You can also do dictionaryСловарь в словаре javascript = '. '; console.log(dictionary); // The above console.log will output:
Как получить доступ к ключам
Если вы хотите получить доступ к этим значениям, вы можете использовать те же опции, что и раньше, только без присвоения.
// Will return "c8b0c9e9b1618b4fb35c47ed4e2fadc7" dictionary[2]; // Will return ". " dictionary['blue-book']; // Will return ". " dictionary.book;
Обратите внимание, что если вы хотите получить доступ к свойству, в котором есть тире или число, вам придется снова использовать скобочную нотацию. Доступ к свойствам с помощью переменных также возможен, как и создание новых свойств.
const key = 'blue-book'; // Will return ". "; dictionaryСловарь в словаре javascript;
Итерация по словарям
Если необходимо просмотреть весь ваш словарь, когда он уже готов к использованию, можно использовать цикл for. in следующим образом:
const dictionary = < . >; for (const key in dictionary) < if (dictionary.hasOwnProperty(key)) < // work on properties console.log(`key: $, value: $`); > >
Чтобы отфильтровать унаследованные свойства, используйте оператор if , чтобы проверить, принадлежит ли свойство, над которым вы работаете, dictionary . Обратите внимание, что доступ к значениям внутри цикла можно получить с помощью скобочной нотации.
О чем следует помнить
Вот как вы можете создавать словари в JavaScript. Некоторые моменты, о которых следует помнить:
- При создании новых словарей используйте объектные литералы для лучшей читабельности.
- Старайтесь придерживаться одного соглашения об именах, будь то camelCase , snake_case или kebab-case .
- Вы можете использовать переменные для записи и доступа к свойствам.
- Обязательно включайте оператор if внутри for. in , если вы хотите отфильтровать унаследованные свойства.
Спасибо, что дочитали до конца, удачного кодинга!
Материал подготовлен в рамках курса «JavaScript Developer. Professional».
Node.js — это асинхронная среда исполнения JavaScript, в основе которой находятся такие понятия как «Event Loop» и событийно-ориентированная архитектура. 2 года назад основатель Node.js Ryan Dahl заявил о создании Deno (палиндром Node) — альтернативной серверной среды исполнения JavaScript и TypeScript. Некоторые концепции остались схожими, а некоторые были придуманы и воплощены с нуля.
Всех желающих приглашаем на двухдневный онлайн-интенсив «Знакомство и сравнение возможностей Deno и Node.js». Цель интенсива — рассмотреть обе среды с точки зрения ключевых возможностей, паттернов, инструментов. Мы сравним примеры небольших, но актуальных приложений и попробуем понять, что представляет из себя современное Server Side окружение JavaScript / TypeScript. >> РЕГИСТРАЦИЯ
JavaScript Basics: How to create a Dictionary with Key/Value pairs
In statically typed programming languages a Dictionary (Key/Value pair collection) object can be very useful at times. While JavaScript doesn’t natively include a type called “Dictionary”, it does contain a very flexible type called “Object”. The JavaScript “Object” type is very versatile since JavaScript is a dynamically typed language. This flexibility allows for the “Object” type to be used in ways that might seem strange when compared to statically typed languages such as C#.
Creating a Dictionary in JavaScript
While there’s no “Dictionary” type in JavaScript, it’s actually really easy to create and use a dictionary object. The following steps show how to go about creating and populating a dictionary with Key/Value pairs:
Step 1: Create a new Object
var dict = new Object(); // or the shorthand way var dict = <>;
You can also initialize the Dictionary with Key/Value pairs when creating it if you are using the shorthand method.
var dict = FirstName: "Chris", "one": 1, 1: "some value" >;
Step 2: Populate Values on the Object
This can be done by either setting the values using the Object’s Indexer property, or just calling it directly as if it were a standard property on the object. As you’ll see below the Key values can be any object and are not limited to Strings.
// using the Indexer dict["one"] = 1; dict[1] = "one"; // add new or update property dict["Age"] = 42; // direct property by name // because it's a dynamic language dict.FirstName = "Chris";
Iterating Key/Value Pairs
A simple JavaScript “for” loop can be used to iterate through your new dictionary.
for(var key in dict) var value = dict[key]; // do something with "key" and "value" variables >
By using the “for(var key in dict)” method of iterating on the object you are able to easily access all the key/value pairs in contains. This method will iterate with each “key” value being the Index on the Object that can be used to access the associated Value.
Access Key/Value Pairs Directly
The Key/Value pairs can be accessed directly on the dictionary Object either through the indexer or as if it’s directly a property on the object.
// using indexer var name = dict["FirstName"]; // as property var name = dict.FirstName;
Functions can be Key or Value Too!
Since JavaScript is a functional language, functions are objects too. As a result, Functions can also be used as either Key and/or Value on your dictionary. For the Dictionary Key, this really does make sense since the Dictionary is really just an Object which can have functions/methods on it. However using Functions as the value may not be the most obvious for developers most comfortable with non-functional programming languages.
Here are some examples of using a Function in both Key and Value of a Dictionary:
var dict = <>; var f = function() // do something >; // setup Function as Value dict['method'] = f; // setup Function as Key dict[f] = 'some value'; // execute Function from Value dict['method'](); var method = dict.method; method(); // get value for Key var val = dict[f];
Hopefully this offers some additional clarification and/or insights into how JavaScript works, and how to make it work how you want/need it to. Happy coding!