Как создать словарь и динамически добавлять пары ключ-значение? - PullRequest
260 голосов
/ 25 августа 2011

От должности:

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

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

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

Я пробовал:

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

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

Ответы [ 14 ]

457 голосов
/ 25 августа 2011
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()) в массив.


Редактировать: Таким образом, почти 5 лет спустя этот ответ получает отрицательные отзывы, потому что он не создает "обычный" литерал объекта JS (он же map, он же hash, он же словарь).
Это is однако создает структуру, которую запрашивал OP (и которая проиллюстрирована в другом вопросе, связанном с), которая представляет собой массив литералов объекта , каждый со свойствами 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";

Обратите внимание, что ключи (имена свойств) всегда являются строками, и нестроковые значения будут принудительно приведеныв строку при использовании в качестве ключа.Например, 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 объекта, если она есть, или использовать строковое представление по умолчанию.

368 голосов
/ 11 марта 2014
var dict = {};

dict['key'] = "testing";

console.log(dict);

работает так же, как python:)

консольный вывод:

Object {key: "testing"} 
52 голосов
/ 25 августа 2011

Это так же просто, как:

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
32 голосов
/ 26 августа 2011

Поскольку вы заявили, что вам нужен объект словаря (а не массив , как я полагаю, некоторые поняли), я думаю, что это то, что вам нужно:

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
21 голосов
/ 19 февраля 2016

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

11 голосов
/ 07 февраля 2018

Вы можете использовать карты с Map, например:

var sayings = new Map();
sayings.set('dog', 'woof');
sayings.set('cat', 'meow');
9 голосов
/ 02 января 2015

Я случайно наткнулся на этот вопрос в поисках чего-то похожего.Это дало мне достаточно информации, чтобы выполнить тест, чтобы получить ответ, который я хотел.Поэтому, если кто-то еще хочет знать, как динамически добавлять или искать пару {ключ: 'значение'} в объекте 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' }
8 голосов
/ 02 июня 2014
var dictionary = {};//create new object
dictionary["key1"] = value1;//set key1
var key1 = dictionary["key1"];//get key1
4 голосов
/ 04 мая 2018

Вы можете создать класс Dictionary, чтобы вы могли легко взаимодействовать со списком Dictionary:

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));
2 голосов
/ 05 марта 2019

В современном javascript (ES6 / ES2015) следует использовать структуру данных Map для словаря.Структура данных Map в ES6 позволяет использовать произвольные значения в качестве ключей.

const map = new Map();
map.set("true", 1);
map.set("false", 0);

Если вы все еще используете ES5, правильный способ создания словаря - создать объект без прототипа следующим образом.

var map = Object.create(null);
map["true"]= 1;
map["false"]= 0;

Существует множество преимуществ создания словаря без объекта-прототипа.Ниже блоги стоит прочитать на эту тему.

dict-pattern

объекты как карты

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...