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.
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.
Tú 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
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
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
}
-
¿Pero con restricciones sobre qué valores pueden tomar las claves? ¿Palabras reservadas, etc.?
-Peter Mortensen
16 abr a las 17:56
Angustia
Puedes usar mapas con Map
como 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
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
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