Существует ли реализация словаря в JavaScript?
Как реализовать массив с индексатором в JavaScript? В .Net есть что-то вроде словаря, а как это реализовать в JavaScript?
5 ответ(ов)
Технически нет, но вы можете использовать обычный объект JavaScript в качестве словаря:
var a = {"a": "wohoo", 2: "hello2", "d": "hello"};
alert(a["a"]);
alert(a[2]);
alert(a["d"]);
Обратите внимание, что в JavaScript ключи объекта могут быть как строками, так и числами. При доступе к значениям вы можете использовать как квадратные скобки, так и точечный нотацию, но при этом ключ должен быть строкой, если вы используете точечную нотацию.
Перевод на русский в стиле ответа на StackOverflow.com:
В вашем вопросе описывается задача, которая ставилась в вашем последнем проекте, касающаяся создания клиентского приложения для браузера, работающего с большими объемами данных. Вам удалось разработать словарь на JavaScript, но с учетом некоторых особенностей языка и ваших собственных предпочтений. Вот что можно выделить из вашего опыта и реализации.
То, что JavaScript не имеет истинного нативного словаря, можно обойти, как вы и сделали, создав собственный класс Dict
. Этот класс использует массив и объект для хранения пар "ключ-значение", а также предоставляет методы для работы с этими данными, такие как добавление, удаление, и проверка существования ключей.
Ваше решение содержит несколько хороших практик:
Инкапсуляция: Вы скрываете массив и объект от внешнего доступа, что предотвращает случайные изменения. Это действительно важный момент, который обеспечивает целостность данных вашего словаря.
Управляемые ключи: Добавление символа подчеркивания в начале ключей для избежания конфликтов с недействительными именами свойств - это умное решение. Это позволяет избежать проблем, которые могут возникнуть из-за несовместимости символов в названиях ключей.
Использование методов массивов: Вы адаптировали методы массива под структуру вашего словаря, что делает его более интуитивным для разработчиков, знакомых с JavaScript. Это повышает удобство использования вашего словаря.
Применение замыканий: Замыкания действительно являются мощным инструментом для обеспечения контроля над функциями и данными. Они позволяют вам организовать код так, чтобы внутренние функции имели доступ к переменным вашего словаря, не поддаваясь внешнему вмешательству.
Подход к проектированию: Вы начали проект с пониманием классов, но быстро адаптировались к прототипному подходу JavaScript, который требует иного понимания. Ваше приложение benefitted от использования объектов-фабрик и методов для создания экземпляров словаря, что отражает хороший стиль проектирования.
Отличное решение для задачи, с которой вы столкнулись! Если у вас есть вопросы или вы хотите обсудить конкретные аспекты реализации, не стесняйтесь спрашивать.
В JavaScript выражение {"index": anyValue}
представляет собой объект (или словарь), где index
— это ключ, а anyValue
— это значение, которое может быть любого типа. Важно отметить, что такие объекты могут использоваться для хранения пар "ключ-значение". Для более подробной информации о формате JSON вы можете обратиться к определению JSON на официальном сайте: json.org.
Наиболее близкой реализацией .NET словаря в JavaScript, которую я использовал, является хэш-объект (см. ссылку: http://www.mojavelinux.com/articles/javascript_hashes.html). Он реализует массив "под капотом" и имеет методы, аналогичные методам .NET словаря.
Ваш вопрос касается использования объекта nDictionary
, который создается с помощью Object.create(null)
, для хранения значений по индексам. Давайте разберем вышеуказанный код на русском.
В коде мы создаем объект nDictionary
, который не имеет свойств Object.prototype
, что позволяет избежать потенциальных конфликтов с встроенными свойствами объекта. Затем мы реализуем две функции: setDictionary
для установления значений по индексу и getDictionary
для их получения.
Вот как выглядит ваш код:
var nDictionary = Object.create(null);
function setDictionary(index, value) {
nDictionary[index] = value;
}
function getDictionary(index) {
return nDictionary[index];
}
setDictionary(81403, "test 1");
setDictionary(81404, "test 2");
setDictionary(81405, "test 3");
setDictionary(81406, "test 4");
setDictionary(81407, "test 5");
alert(getDictionary(81403));
- Мы создаем пустой объект
nDictionary
без свойств родителя. - Функция
setDictionary(index, value)
принимает индекс и значение, добавляет их в объект. - Функция
getDictionary(index)
возвращает значение по заданному индексу. - Мы добавляем пять значений в
nDictionary
с разными индексами. - На последнем шаге вызываем
alert
, который показывает значение по индексу81403
, то есть "test 1".
Если у вас есть дополнительные вопросы или нужна помощь, не стесняйтесь спрашивать!
Как перемешать (сделать случайным) массив в JavaScript?
Как объединить два массива в JavaScript и удалить дубликаты?
Как удалить все дубликаты из массива объектов?
Самый быстрый способ дублирования массива в JavaScript: slice против цикла 'for'
Как проверить, содержит ли массив строку в TypeScript?