Cómo crear un diccionario y agregar pares clave-valor dinámicamente en JavaScript

Resuelto KenEucker asked hace 13 años • 17 respuestas

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.

KenEucker avatar Aug 26 '11 02:08 KenEucker
Aceptado

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 keyy 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 keypropiedades 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 Dateobjeto 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 objAde objBser elementos completamente diferentes y únicos, ambos tienen la misma representación de cadena básica: "[object Object]".

La razón Datepor la que no se comporta así es que el Dateprototipo tiene un toStringmé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 toStringimplementación del objeto, si la hay, o usará la representación de cadena predeterminada.

Flambino avatar Aug 25 '2011 19:08 Flambino

Usar:

var dict = {};

dict['key'] = "testing";

console.log(dict);

Funciona igual que Python :)

Salida de consola:

Object {key: "testing"}
Tcll avatar Mar 11 '2014 02:03 Tcll

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
Simon Sarris avatar Aug 25 '2011 19:08 Simon Sarris