Как динамически создавать словарь и добавлять пары ключ–значение?
от модератора:
отправка массива JSON для получения в виде словаря
Я пытаюсь сделать то же самое, что и этот пост. Единственная проблема заключается в том, что я не знаю, что ключи и значения являются авансом. Поэтому мне нужно иметь возможность динамически добавлять пары ключей и значений, и я не знаю, как это сделать.
кто-нибудь знает как создать этот объект и динамически добавлять пары ключ-значение?
Я пробовал:
var vars = [{key:"key", value:"value"}];
vars[0].key = "newkey";
vars[0].value = "newvalue";
но это не сработает.
13 ответов:
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
в принципе, вы создаете литерал объекта с 2 свойствами (называется
key
иvalue
) и вставить его (используяpush()
) в массив.
Edit: Итак, почти 5 лет спустя этот ответ получает downvotes, потому что он не создает "нормальный" литерал объекта JS (aka map, aka hash, aka dictionary).
Это и однако создание структуры, которую запросил ОП (и которая проиллюстрирована в другом вопрос связан с), который массив объектных литералов, С каждогоkey
иvalue
свойства. Не спрашивайте меня, почему эта структура была необходима, но это тот, который был запрошен.но, Но, если то, что вы хотите в простом объекте JS-и не структура ОП просил-см. ответ tcll, хотя скобочная нотация немного громоздка, если у вас просто есть простые ключи, которые являются допустимыми именами 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.
вы do нужна нотация скобок, если у вас есть ключи, в которых есть пробелы, специальные символы или что-то подобное. Например:
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";
обратите внимание, что ключи (имена свойств) всегда являются строками, А нестроковые значения будут приведены к строке при использовании в качестве ключа. Например, a
Date
объект преобразуется в его строковое представление:dict[new Date] = "today's value"; console.log(dict); // => { // "Sat Nov 04 2016 16:15:31 GMT-0700 (PDT)": "today's 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
реализация, если таковая имеется, или использовать строковое представление по умолчанию.
var dict = {}; dict['key'] = "testing"; console.log(dict);
работает так же, как python:)
консоль вывода:
Object {key: "testing"}
его так:
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
поскольку вы заявили, что хотите объект словаря (и не массив как я предполагаю, некоторые понимают) я думаю, что это то, что вы после:
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
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 }
я случайно наткнулся на этот вопрос, ища что-то подобное. Это дало мне достаточно информации, чтобы запустить тест, чтобы получить ответ, который я хотел. Поэтому, если кто-то еще хочет знать, как динамически добавлять или искать пару {key: 'value'} в объекте 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' }
var dictionary = {};//create new object dictionary["key1"] = value1;//set key1 var key1 = dictionary["key1"];//get key1
Вы можете использовать карты с
Map
, например:var sayings = new Map(); sayings.set('dog', 'woof'); sayings.set('cat', 'meow');
вы можете создать словарь класса, чтобы вы могли легко взаимодействовать со списком словарей:
class Dictionary { constructor() { this.items = {}; } has(key) { return key in this.items; } set(key,value) { this.items[key] = value; } delete(key) { if( this.has(key) ){ delete this.items[key] return true; } return false; } } var d = new Dictionary(); d.set(1, "value1") d.set(2, "value2") d.set(3, "value3") console.log(d.has(2)); d.delete(2); console.log(d.has(2));
я столкнулся с этой проблемой.. но в цикле 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];
как насчет одного лайнера для создания пары ключевых значений?
let result = { ["foo"]: "some value" };
и некоторые функции итератора, такие как
reduce
для динамического преобразования массива в словарьvar options = [ { key: "foo", value: 1 }, { key: "bar", value: {id: 2, name: "two"} }, { key: "baz", value: {["active"]: true} }, ]; var result = options.reduce((accumulator, current) => { accumulator[current.key] = current.value; return accumulator; }, {}); console.log(result);
это помогло бы тонне узнать, что ваш конечный желаемый результат, но я думаю, что это то, что вы хотите:
var vars = [{key:"key", value:"value"}]; vars.push({key: "newkey", value: "newvalue"})
на
var dict = {}
использоватьvar dict = Object.create(null)
.это создаст пустой объект, который делает не есть
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 :)") }