Как создать словарь и добавить пары ключ-значение динамически?

Из сообщения:

Отправка массива 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 :)")
}