Cómo crear un diccionario y agregar pares de valores clave dinámicamente en JavaScript

7 minutos de lectura

Avatar de usuario de KenEucker
KenEucker

De la publicación:

Envío de una matriz JSON para que se reciba como Dictionary,

Estoy tratando de hacer lo mismo que esa publicación. El único problema es que no sé cuáles son las claves y los valores por adelantado. Entonces, necesito poder agregar dinámicamente los pares de clave y valor y no sé cómo hacerlo.

¿Cómo puedo crear ese objeto y agregar pares de valores clave dinámicamente?

He intentado:

var vars = [{key:"key", value:"value"}];
vars[0].key = "newkey";
vars[0].value = "newvalue";

Pero eso no funciona.

  • Funciona muy bien. consola.log(vars); muéstrame[ Object key: “newkey” value: “newvalue” proto: Object ]

    – Alex Pluutau

    25 de agosto de 2011 a las 19:42


  • Excepto que es una lista, no un diccionario: \ Creo que los datos también se representan mejor como una lista de “pares”, como list = [["key1","value1"],["key2","value2"]]. Algunos otros idiomas tienen un tipo de “par” o “tupla”. tldr para dictado real agregando: dict['key'] = "value"

    – Jordán Stewart

    19 de marzo de 2020 a las 11:36


Avatar de usuario de Flambino
Flambino

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 insertarlo (usando push()) en la matriz.


Esto no crea un literal de objeto JavaScript “normal” (también conocido como mapa, también conocido como hash, también conocido como diccionario). Él es sin embargo, crear la estructura que solicitó OP (y que se ilustra en la otra pregunta vinculada), que es una matriz de objetos literalescada uno con key y value propiedades. No me pregunten por qué se requería esa estructura, pero es la que se pidió.

Pero, pero, si lo que desea en un objeto JavaScript simple, y no la estructura que OP solicitó: consulte la respuesta de tcll, aunque la notación entre paréntesis es un poco engorrosa si solo tiene claves simples que son nombres de JavaScript válidos. Puedes hacer esto:

// Object literal with properties
var dict = {
  key1: "value1",
  key2: "value2"
  // etc.
};

O use la notación de puntos regular 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.

hacer desea la notación de corchetes si tiene teclas que tienen espacios, caracteres especiales o cosas por el estilo. 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 la notación de 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 coaccionarán a una cadena cuando se usen como clave. por ejemplo, un Date el 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]" lo que no hace para una clave no única. Así que ten 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 de objA y objB siendo elementos completamente diferentes y únicos, ambos tienen la misma representación de cadena básica: "[object Object]".

La razón Date no se comporta así es que el Date prototipo tiene una costumbre toString método 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 aleatorio número, las colisiones de nombre aún pueden ocurrir muy fácilmente. Es solo para ilustrar una implementación de toString.)

Entonces, cuando intente usar objetos como claves, JavaScript usará el propio objeto toString implementación, si la hay, o utilice la representación de cadena predeterminada.

  • @CsabaToth No, dict no es un diccionario asociativo. Es una matriz de objetos, cada uno de los cuales es un poco como un diccionario con dos claves: “clave” y “valor”.

    – Román Starkov

    08/07/2015 a las 20:13

  • Lo que tienes allí es una matriz que simplemente se llama ‘dict’.

    – Jan Kyu Peblik

    7 de agosto de 2018 a las 16:52

  • Agradecemos la actualización y la información adicional de seguimiento.

    – jacob

    5 de mayo de 2019 a las 2:25

Avatar de usuario de Tcll
Tcll

Usar:

var dict = {};

dict['key'] = "testing";

console.log(dict);

Funciona igual que Python 🙂

Salida de la consola:

Object {key: "testing"}

  • Este es sin duda el mejor enfoque para crear un diccionario, ¡y ES la respuesta correcta!

    – romano

    10 de marzo de 2015 a las 19:02

  • Muy importante para inicializar con corchetes. {} en lugar de paréntesis

    – Jaider

    7 oct 2015 a las 20:19


  • También uso objetos básicos como diccionarios como este. ¡Me alegra ver que ese es el camino correcto!

    – TKoL

    2 de febrero de 2016 a las 10:13

  • ¡’Belleza’ de javascript! El objeto ES en realidad un diccionario de pares de valores clave en sí mismo

    – 100r

    24 de enero de 2018 a las 11:27

  • @Azurespot, la clave puede ser cualquier cosa que se pueda modificar, después de todo, las claves se ordenan por hash, lo que en python3 difiere cada ejecución.

    – Tcl

    15 de agosto de 2019 a las 9:55


Avatar de usuario de Simon Sarris
Simón Sarris

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

  • @KenEucker Creo que es útil tener respuestas incorrectas en preguntas como esta. Especialmente si alguien explica por qué está equivocado, es un buen recurso de aprendizaje.

    – CJBrew

    28 de septiembre de 2016 a las 11:12

Dado que ha declarado que desea un objeto de diccionario (y no una matriz como supongo que algunos entendieron) Creo que esto es lo que buscas:

var input = [{key:"key1", value:"value1"},{key:"key2", value:"value2"}];

var result = {};

for(var i = 0; i < input.length; i++)
{
    result[input[i].key] = input[i].value;
}

console.log(result); // Just for testing

JavaScript Object es en sí mismo como un diccionario. No hay necesidad de reinventar la rueda.

var dict = {};

// Adding key-value -pairs
dict['key'] = 'value'; // Through indexer
dict.anotherKey = 'anotherValue'; // Through assignment

// Looping through
for (var item in dict) {
  console.log('key:' + item + ' value:' + dict[item]);
  // Output
  // key:key value:value
  // key:anotherKey value:anotherValue
}

// Non existent key
console.log(dict.notExist); // undefined

// Contains key?
if (dict.hasOwnProperty('key')) {
  // Remove item
  delete dict.key;
}

// Looping through
for (var item in dict) {
  console.log('key:' + item + ' value:' + dict[item]);
  // Output
  // key:anotherKey value:anotherValue
}

Violín

  • ¿Pero con restricciones sobre qué valores pueden tomar las claves? ¿Palabras reservadas, etc.?

    -Peter Mortensen

    16 abr a las 17:56

Avatar de usuario de Pang
Angustia

Puedes usar mapas con Mapcomo esto:

var sayings = new Map();
sayings.set('dog', 'woof');
sayings.set('cat', 'meow');

  • ¿Pero con restricciones sobre qué valores pueden tomar las claves? ¿Palabras reservadas, etc.?

    -Peter Mortensen

    16 abr a las 17:56

Avatar de usuario de Peter Mortensen
Pedro Mortensen

Con ES6Puedes hacerlo:

let cake="🍰";

let pan = {
  [cake]: '🥞',
};

// Output -> { '🍰': '🥞' }

Vieja forma (vainilla JavaScript)

let cake="🍰";
let pan = {};
pan[cake] = '🥞';

// Output -> { '🍰': '🥞' }

  • Me gusta esta solución, ya que está actualizada para los tiempos modernos y es bastante elegante. Gracias por tu contribución. Esta habría sido una solución válida para lo que necesitaba en ese momento.

    – Ken Eucker

    7 de diciembre de 2020 a las 3:58

¿Ha sido útil esta solución?