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
Zasadniczo tworzysz literał obiektu z 2 właściwościami (nazywanymi key
i value
) i wstawiasz go (za pomocą push()
) do tablicy.
Edycja: A więc prawie 5 lat później ta odpowiedź jest negatywna, ponieważ nie tworzy „normalnego” dosłownego obiektu JS (aka map, aka hash, aka słownik).
To jest jednak tworząc strukturę PO zażądano (i które są zilustrowane w innych kwestii związanych z), która jest tablicą literałach obiektów , z których każdy key
, a value
właściwości. Nie pytaj mnie, dlaczego ta struktura była wymagana, ale o tę poproszono.
Ale, ale jeśli chcesz tego w prostym obiekcie JS - a nie o strukturę, o którą prosi OP - zobacz odpowiedź tcll , chociaż notacja w nawiasach jest nieco kłopotliwa, jeśli masz tylko proste klucze, które są prawidłowymi nazwami JS. Możesz po prostu to zrobić:
// object literal with properties
var dict = {
key1: "value1",
key2: "value2"
// etc.
};
Lub użyj zwykłej notacji kropkowej, aby ustawić właściwości po utworzeniu obiektu:
// empty object literal with properties added afterward
var dict = {};
dict.key1 = "value1";
dict.key2 = "value2";
// etc.
Ty nie chcesz notacji nawiasu jeśli masz klucze, które mają spacje w nich znaki specjalne lub takie rzeczy. Na przykład:
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";
Chcesz także notacji nawiasowej, jeśli twoje klucze są dynamiczne:
dict[firstName + " " + lastName] = "some value";
Zauważ, że klucze (nazwy właściwości) są zawsze ciągami, a wartości nie łańcuchowe będą wymuszone na łańcuch, gdy zostaną użyte jako klucz. Np. Date
Obiekt zostaje przekonwertowany na jego reprezentację ciągu:
dict[new Date] = "today's value";
console.log(dict);
// => {
// "Sat Nov 04 2016 16:15:31 GMT-0700 (PDT)": "today's value"
// }
Zauważ jednak, że to niekoniecznie „po prostu działa”, ponieważ wiele obiektów będzie miało ciąg znaków, "[object Object]"
co nie oznacza, że nie jest unikalny klucz. Uważaj więc na coś takiego:
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" }
Mimo objA
i objB
będąc całkowicie różnych i unikalnych elementów, oba mają taką samą podstawową reprezentację ciąg: "[object Object]"
.
Powodem Date
tego nie jest to, że Date
prototyp ma niestandardową toString
metodę, która zastępuje domyślną reprezentację ciągu. Możesz zrobić to samo:
// 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"
// }
(Należy zauważyć, że ponieważ powyższe używa liczb losowych , kolizje nazw mogą nadal występować bardzo łatwo. To tylko ilustruje implementację toString
.)
Dlatego podczas próby użycia obiektów jako kluczy JS użyje własnej toString
implementacji obiektu, jeśli istnieje, lub użyje domyślnej reprezentacji ciągu.