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
объекта, если она есть, или использовать строковое представление по умолчанию.