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


от модератора:

отправка массива JSON для получения в виде словаря

Я пытаюсь сделать то же самое, что и этот пост. Единственная проблема заключается в том, что я не знаю, что ключи и значения являются авансом. Поэтому мне нужно иметь возможность динамически добавлять пары ключей и значений, и я не знаю, как это сделать.

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

Я пробовал:

var vars = [{key:"key", value:"value"}];
vars[0].key = "newkey";
vars[0].value = "newvalue";

но это не сработает.

13 211

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 :)")
}