Cómo crear un diccionario y agregar pares clave-valor dinámicamente en JavaScript
De la publicación:
Envío de una matriz JSON para recibirla como Diccionario<cadena,cadena> ,
Estoy intentando hacer lo mismo que esa publicación. El único problema es que no sé cuáles son las claves y los valores de antemano. Entonces necesito poder agregar dinámicamente los pares clave y valor y no sé cómo hacerlo.
¿Cómo puedo crear ese objeto y agregar pares clave-valor dinámicamente?
He intentado:
var vars = [{key:"key", value:"value"}];
vars[0].key = "newkey";
vars[0].value = "newvalue";
Pero eso no funciona.
Usar:
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
Básicamente, estás creando un objeto literal con dos propiedades (llamadas key
y value
) e insertándolo (usando push()
) en la matriz.
Esto no crea un objeto literal JavaScript "normal" (también conocido como mapa, también conocido como hash, también conocido como diccionario). Sin embargo , está creando la estructura que solicitó OP (y que se ilustra en la otra pregunta vinculada), que es una matriz de objetos literales , cada uno con key
propiedades value
. No me pregunten por qué se requirió esa estructura, pero es la que se pidió.
Pero, pero, si lo que desea es un objeto JavaScript simple, y no la estructura solicitada por OP, consulte la respuesta de tcll , aunque la notación entre corchetes es un poco engorrosa si solo tiene claves simples que son nombres válidos de JavaScript. Puedes hacer esto:
// Object literal with properties
var dict = {
key1: "value1",
key2: "value2"
// etc.
};
O utilice la notación de puntos normal para establecer propiedades después de crear un objeto:
// Empty object literal with properties added afterward
var dict = {};
dict.key1 = "value1";
dict.key2 = "value2";
// etc.
Desea la notación entre corchetes si tiene claves que tienen espacios, caracteres especiales o cosas así. P.ej:
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";
También desea notación entre corchetes si sus claves son dinámicas:
dict[firstName + " " + lastName] = "some value";
Tenga en cuenta que las claves (nombres de propiedad) son siempre cadenas, y los valores que no son cadenas se convertirán en una cadena cuando se utilicen como clave. Por ejemplo, un Date
objeto se convierte a su representación de cadena:
dict[new Date] = "today's value";
console.log(dict);
// => {
// "Sat Nov 04 2016 16:15:31 GMT-0700 (PDT)": "today's value"
// }
Sin embargo, tenga en cuenta que esto no necesariamente "simplemente funciona", ya que muchos objetos tendrán una representación de cadena como "[object Object]"
la cual no constituye una clave no única. Así que tenga cuidado con algo como:
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" }
A pesar objA
de objB
ser elementos completamente diferentes y únicos, ambos tienen la misma representación de cadena básica: "[object Object]"
.
La razón Date
por la que no se comporta así es que el Date
prototipo tiene un toString
método personalizado que anula la representación de cadena predeterminada. Y tu puedes hacer lo mismo:
// 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"
// }
(Tenga en cuenta que, dado que lo anterior utiliza un número aleatorio , las colisiones de nombres aún pueden ocurrir muy fácilmente. Es solo para ilustrar una implementación de toString
.)
Entonces, al intentar usar objetos como claves, JavaScript usará la propia toString
implementación del objeto, si la hay, o usará la representación de cadena predeterminada.
Usar:
var dict = {};
dict['key'] = "testing";
console.log(dict);
Funciona igual que Python :)
Salida de consola:
Object {key: "testing"}
Es tan simple como:
var blah = {}; // Make a new dictionary (empty)
o
var blah = {key: value, key2: value2}; // Make a new dictionary with two pairs
Entonces
blah.key3 = value3; // Add a new key/value pair
blah.key2; // Returns value2
blah['key2']; // Also returns value2