Как создать словарь и добавить пары ключ-значение динамически?
Из сообщения:
Отправка массива JSON для приема в виде словаря < string, string >
Я пытаюсь сделать то же самое, что и этот пост. Единственная проблема заключается в том, что я не знаю, какие ключи и значения заранее. Поэтому мне нужно иметь возможность динамически добавлять пары ключей и значений, и я не знаю, как это сделать.
Кто-нибудь знает, как создать этот объект и динамически добавлять пары значений ключа?
Ive попробовал:
var vars = [{key:"key", value:"value"}];
vars[0].key = "newkey";
vars[0].value = "newvalue";
Но это не работает.
Ответы
Ответ 1
var dict = []; // create an empty array
dict.push({
key: "keyName",
value: "the value"
});
// repeat this last part as needed to add more key/value pairs
В принципе, вы создаете литерал объекта с двумя свойствами (называемыми key
и value
) и вставляя его (используя push()
) в массив.
Изменить: Итак, почти через 5 лет этот ответ получает downvotes, потому что он не создает "нормальный" JS-объект литерала (aka map, aka hash, aka dictionary).
Тем не менее, создается структура, которую ОП запросила (и которая проиллюстрирована в другом связанном с вопросом вопросе), который представляет собой массив объектных литералов, каждый из которых имеет свойства key
и value
. Не спрашивайте меня, зачем нужна эта структура, но это тот, о котором просили.
Но, если вы хотите в простом объекте JS, а не в структуре, которую запросил OP, см. tcll answer, хотя нотация скобок немного громоздко, если у вас просто есть простые ключи, которые являются действительными именами JS. Вы можете просто сделать это:
// object literal with properties
var dict = {
key1: "value1",
key2: "value2"
// etc.
};
Или используйте регулярную точечную нотацию для задания свойств после создания объекта:
// empty object literal with properties added afterward
var dict = {};
dict.key1 = "value1";
dict.key2 = "value2";
// etc.
Вам нужна нотация скобки, если у вас есть ключи, в которых есть пробелы, специальные символы или что-то в этом роде. Например:
var dict = {};
// this obviously won't work
dict.some invalid key (for multiple reasons) = "value1";
// but this will
dict["some invalid key (for multiple reasons)"] = "value1";
Вы также хотите иметь нотацию в виде скобок, если ваши клавиши динамические:
dict[firstName + " " + lastName] = "some value";
Обратите внимание, что ключи (имена свойств) всегда являются строками, а значения, отличные от строки, будут принудительно привязаны к строке при использовании в качестве ключа. Например. Объект Date
преобразуется в его строковое представление:
dict[new Date] = "today value";
console.log(dict);
// => {
// "Sat Nov 04 2016 16:15:31 GMT-0700 (PDT)": "today value"
// }
Обратите внимание, что это не обязательно "просто работает", так как у многих объектов будет такое строковое представление, как "[object Object]"
, которое не делает для не-уникального ключа. Поэтому будьте осторожны с чем-то вроде:
var objA = { a: 23 },
objB = { b: 42 };
dict[objA] = "value for objA";
dict[objB] = "value for objB";
console.log(dict);
// => { "[object Object]": "value for objB" }
Несмотря на то, что objA
и objB
являются совершенно разными и уникальными элементами, оба они имеют одно и то же базовое строковое представление: "[object Object]"
.
Причина Date
не ведет себя так, как будто прототип Date
имеет собственный метод toString
, который переопределяет стандартное представление строки. И вы можете сделать то же самое:
// a simple constructor with a toString prototypal method
function Foo() {
this.myRandomNumber = Math.random() * 1000 | 0;
}
Foo.prototype.toString = function () {
return "Foo instance #" + this.myRandomNumber;
};
dict[new Foo] = "some value";
console.log(dict);
// => {
// "Foo instance #712": "some value"
// }
(Обратите внимание, что, поскольку в приведенном выше примере используется случайное число, коллизии имен все равно могут происходить очень легко. Это просто для иллюстрации реализации toString
.)
Поэтому, пытаясь использовать объекты в качестве ключей, JS будет использовать реализацию собственного объекта toString
, если таковая имеется, или использовать строковое представление по умолчанию.
Ответ 2
var dict = {};
dict['key'] = "testing";
console.log(dict);
работает так же, как python:)
консольный вывод:
Object {key: "testing"}
Ответ 3
Его так же просто, как:
var blah = {}; // make a new dictionary (empty)
или
var blah = {key: value, key2: value2}; // make a new dictionary with two pairs
затем
blah.key3 = value3; // add a new key/value pair
blah.key2; // returns value2
blah['key2']; // also returns value2
Ответ 4
Поскольку вы заявили, что хотите объект словаря (и не массив, как я предполагаю, некоторые понимают), я думаю, что это то, что вам нужно:
var input = [{key:"key1", value:"value1"},{key:"key2", value:"value2"}];
var result = {};
for(var i = 0; i < input.length; i++)
{
result[input[i].key] = input[i].value;
}
console.log(result); // Just for testing
Ответ 5
JavaScript Object
сам по себе, как словарь. Нет необходимости изобретать велосипед.
var dict = {};
// Adding key-value -pairs
dict['key'] = 'value'; // Through indexer
dict.anotherKey = 'anotherValue'; // Through assignment
// Looping through
for (var item in dict) {
console.log('key:' + item + ' value:' + dict[item]);
// Output
// key:key value:value
// key:anotherKey value:anotherValue
}
// Non existent key
console.log(dict.notExist); // undefined
// Contains key?
if (dict.hasOwnProperty('key')) {
// Remove item
delete dict.key;
}
// Looping through
for (var item in dict) {
console.log('key:' + item + ' value:' + dict[item]);
// Output
// key:anotherKey value:anotherValue
}
Fiddle
Ответ 6
Мне довелось пройти этот вопрос, ища что-то подобное. Это дало мне достаточно информации для запуска теста, чтобы получить ответ, который я хотел. Поэтому, если кто-то еще хочет знать, как динамически добавлять или искать пару {ключ: 'значение'} в объекте JavaScript, этот тест должен рассказать вам все, что вам может понадобиться.
var dictionary = {initialkey: 'initialValue'};
var key = 'something';
var key2 = 'somethingElse';
var value = 'value1';
var value2 = 'value2';
var keyInitial = 'initialkey';
console.log(dictionary[keyInitial]);
dictionary[key] =value;
dictionary[key2] = value2;
console.log(dictionary);
Выход
initialValue
{ initialkey: 'initialValue',
something: 'value1',
somethingElse: 'value2' }
Ответ 7
var dictionary = {};//create new object
dictionary["key1"] = value1;//set key1
var key1 = dictionary["key1"];//get key1
Ответ 8
Я столкнулся с этой проблемой, но в цикле for. Верхнее решение не работало (при использовании переменных (а не строк) для параметров функции push), а остальные не учитывали значения ключей на основе переменных. Я был удивлен, что этот подход (который распространен в php) работал.
// example dict/json
var iterateDict = {'record_identifier': {'content':'Some content','title':'Title of my Record'},
'record_identifier_2': {'content':'Some different content','title':'Title of my another Record'} };
var array = [];
// key to reduce the 'record' to
var reduceKey = 'title';
for(key in iterateDict)
// ultra-safe variable checking...
if(iterateDict[key] !== undefined && iterateDict[key][reduceKey] !== undefined)
// build element to new array key
array[key]=iterateDict[key][reduceKey];
Ответ 9
Это помогло бы тонне понять, каков ваш конечный желаемый результат, но я думаю, что это то, что вы хотите:
var vars = [{key:"key", value:"value"}];
vars.push({key: "newkey", value: "newvalue"})
Ответ 10
Улучшение var dict = {}
заключается в использовании var dict = Object.create(null)
.
Это создаст пустой объект, который not имеет Object.prototype
как прототип.
var dict1 = {};
if (dict1["toString"]){
console.log("Hey, I didn't put that there!")
}
var dict2 = Object.create(null);
if (dict2["toString"]){
console.log("This line won't run :)")
}