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
Fondamentalmente, stai creando un oggetto letterale con 2 proprietà (chiamato key
e value
) e inserendolo (usando push()
) nell'array.
Modifica: Quindi quasi 5 anni dopo, questa risposta sta ricevendo voti negativi perché non sta creando un oggetto JS "normale" letterale (aka mappa, aka hash, aka dizionario).
Si è tuttavia creando la struttura che OP chiesto (e che è illustrata in altra questione legata a), che è una matrice di letterali oggetto , ognuno con key
e value
proprietà. Non chiedermi perché era richiesta quella struttura, ma è quella che è stata chiesta.
Ma, tuttavia, se quello che vuoi in un semplice oggetto JS - e non la struttura richiesta da OP - vedi la risposta di tcll , sebbene la notazione tra parentesi sia un po 'ingombrante se hai solo chiavi semplici che sono nomi JS validi. Puoi fare solo questo:
// object literal with properties
var dict = {
key1: "value1",
key2: "value2"
// etc.
};
Oppure usa la notazione regolare per impostare le proprietà dopo aver creato un oggetto:
// empty object literal with properties added afterward
var dict = {};
dict.key1 = "value1";
dict.key2 = "value2";
// etc.
È cosa vuole la notazione staffa se hai le chiavi che hanno spazi tra loro, caratteri speciali, o cose del genere. Per esempio:
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";
Vuoi anche la notazione tra parentesi se le tue chiavi sono dinamiche:
dict[firstName + " " + lastName] = "some value";
Si noti che le chiavi (nomi delle proprietà) sono sempre stringhe e che i valori non stringa verranno convertiti in una stringa quando utilizzati come chiave. Ad esempio un Date
oggetto viene convertito nella sua rappresentazione di stringa:
dict[new Date] = "today's value";
console.log(dict);
// => {
// "Sat Nov 04 2016 16:15:31 GMT-0700 (PDT)": "today's value"
// }
Si noti tuttavia che ciò non "funziona", poiché molti oggetti avranno una rappresentazione in forma di stringa "[object Object]"
che non costituisce una chiave non univoca. Quindi diffidare di qualcosa come:
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" }
Nonostante objA
e objB
essendo elementi completamente diversi e unici, entrambi hanno la stessa rappresentazione di base stringa: "[object Object]"
.
La ragione per cui Date
non si comporta in questo modo è che il Date
prototipo ha un'abitudinetoString
metodo che sovrascrive la rappresentazione di stringa predefinita. E puoi fare lo stesso:
// 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"
// }
(Si noti che poiché quanto sopra utilizza un numero casuale , le collisioni di nomi possono comunque verificarsi molto facilmente. È solo per illustrare un'implementazione di toString
.)
Pertanto, quando si tenta di utilizzare gli oggetti come chiavi, JS utilizzerà l' toString
implementazione dell'oggetto stesso , se presente, o utilizzerà la rappresentazione di stringa predefinita.