Из поста:
Отправка массива JSON для получения в виде словаря <string, string>
Я пытаюсь сделать то же самое, что и этот пост. Единственная проблема заключается в том, что я не знаю, какие ключи и значения заранее. Поэтому мне нужно иметь возможность динамически добавлять пары ключ и значение, и я не знаю, как это сделать.
Кто-нибудь знает, как создать этот объект и динамически добавлять пары ключ-значение?
Я пробовал:
var vars = [{key:"key", value:"value"}];
vars[0].key = "newkey";
vars[0].value = "newvalue";
Но это не работает.
javascript
dictionary
key-value
KenEucker
источник
источник
list = [["key1","value1"],["key2","value2"]]
. Некоторые другие языки имеют тип «пара» или «кортеж». Tldr для фактического добавления dict:dict['key'] = "value"
Ответы:
По сути, вы создаете литерал объекта с двумя свойствами (называемыми
key
иvalue
) и вставляете его (используяpush()
) в массив.Редактировать: Таким образом, почти 5 лет спустя, этот ответ получает отрицательные отзывы, потому что он не создает «нормальный» литерал объекта JS (он же map, он же hash, он же словарь).
Это будет , однако создание структуры , что ОП просили (и который проиллюстрирован на другой вопрос связан с), который является массивом литералов объектов , каждый из которых имеет
key
иvalue
свойства. Не спрашивайте меня, почему эта структура была необходима, но это та, которую просили.Но, если, что вы хотите в простом объекте JS - а не в структуре, которую запрашивал OP, - см . Ответ tcll , хотя обозначение в скобках немного громоздко, если у вас просто простые ключи, которые являются действительными именами JS. Вы можете просто сделать это:
Или используйте обычные точечные обозначения для установки свойств после создания объекта:
Вы действительно хотите , кронштейн обозначения , если у вас есть ключи , которые имеют пробелы в них, специальные символы, или тому подобное. Например:
Вам также нужна скобочная запись, если ваши ключи динамические:
Обратите внимание, что ключи (имена свойств) всегда являются строками, а не строковые значения будут приводиться к строке при использовании в качестве ключа. Например,
Date
объект преобразуется в его строковое представление:Однако обратите внимание, что это не обязательно «просто работает», так как многие объекты будут иметь строковое представление, подобное тому,
"[object Object]"
которое не создает неуникальный ключ. Так что будьте осторожны с чем-то вроде:Несмотря на
objA
иobjB
быть совершенно разными и уникальными элементы, они оба имеют одинаковое строковое представление:"[object Object]"
.Причина
Date
не в том, чтоDate
прототип имеет собственныйtoString
метод, который переопределяет строковое представление по умолчанию. И вы можете сделать то же самое:(Обратите внимание, что поскольку в приведенном выше примере используется случайное число, коллизии имен могут по-прежнему происходить очень легко. Это просто для иллюстрации реализации
toString
.)Поэтому при попытке использовать объекты в качестве ключей JS будет использовать собственную
toString
реализацию объекта , если таковая имеется, или использовать строковое представление по умолчанию.источник
dict
это не ассоциативный словарь. Это массив объектов, каждый из которых похож на словарь с двумя ключами: «ключ» и «значение».работает как питон :)
консольный вывод:
источник
{}
а не круглыми скобкамиЭто так же просто, как:
или
затем
источник
Поскольку вы заявили, что вам нужен объект словаря (а не массив, как я полагаю, некоторые поняли), я думаю, что вы ищете:
источник
В JavaScript
Object
является сам по себе , как словарь. Не нужно изобретать велосипед.скрипка
источник
Вы можете использовать карты
Map
, например:источник
Мне довелось пройтись по этому вопросу в поисках чего-то похожего. Это дало мне достаточно информации, чтобы выполнить тест, чтобы получить ответ, который я хотел. Поэтому, если кто-то еще хочет знать, как динамически добавлять или искать пару {ключ: 'значение'} в объекте JavaScript, этот тест должен рассказать вам все, что вам может понадобиться знать.
вывод
источник
источник
key1 = dictionary.key1
а не индексироватьkey1 = dictionary["key1"]
Вы можете создать класс Dictionary, чтобы вы могли легко взаимодействовать со списком Dictionary:
источник
как насчет одного лайнера для создания пары ключ-значение?
и некоторые итераторы любят
reduce
динамически преобразовывать массив в словарьисточник
В современном javascript (ES6 / ES2015) следует использовать структуру данных Map для словаря. Структура данных карты в ES6 позволяет использовать произвольные значения в качестве ключей.
Если вы все еще используете ES5, правильный способ создания словаря - создать объект без прототипа следующим образом.
Есть много преимуществ создания словаря без объекта-прототипа. Ниже блоги стоит почитать на эту тему.
ДИКТ-паттерн
объекты-как-карты
источник
Это помогло бы многим узнать, каков ваш конечный желаемый результат, но я думаю, что это то, что вы хотите:
источник
Я столкнулся с этой проблемой .. но в рамках цикла. Верхнее решение не работало (при использовании переменных (а не строк) для параметров функции push), а другие не учитывали значения ключей, основанные на переменных. Я был удивлен, что этот подход (который распространен в php) работал ..
источник
Улучшение
var dict = {}
заключается в использованииvar dict = Object.create(null)
.Это создаст пустой объект, который не имеет
Object.prototype
своего прототипа.источник
источник