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 лет спустя, этот ответ получает отрицательные отзывы, потому что он не создает «нормальный» литерал объекта JS (он же map, он же hash, он же словарь).
Это будет , однако создание структуры , что ОП просили (и который проиллюстрирован на другой вопрос связан с), который является массивом литералов объектов , каждый из которых имеет key
и value
свойства. Не спрашивайте меня, почему эта структура была необходима, но это та, которую просили.
Но, если, что вы хотите в простом объекте JS - а не в структуре, которую запрашивал OP, - см . Ответ 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.
Вы действительно хотите , кронштейн обозначения , если у вас есть ключи , которые имеют пробелы в них, специальные символы, или тому подобное. Например:
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
реализацию объекта , если таковая имеется, или использовать строковое представление по умолчанию.