2012-05-17 19 views
31

Estoy intentando crear un objeto de diccionario al igual queclave para Javascript diccionario no se almacena como valor, sino como nombre de la variable

var obj = { varName : varValue }; 

Lo que estoy esperando es que si varName='foo', el obj debería ser sin embargo lo que {'foo', 'some value' } Veo es {varName, 'some value'} el valor de la variable no se está utilizando, pero un nombre de variable como una clave. ¿Cómo lo hago para que el valor variable se use como clave?

+0

posible duplicado de [Cómo utilizar una variable como una llave dentro initialiser objeto] (http://stackoverflow.com/questions/ 10631007/how-to-use-a-variable-as-a-key-inside-object-initialiser) – zzzzBov

Respuesta

63

Trate de esta manera:

var obj = {}; 
obj[varName] = varValue; 

No se puede inicializar objetos con claves dinámicas '' en el viejo Javascript. var obj = { varName : varValue }; es equivalente a var obj = { "varName" : varValue };. Así es como interpreta Javascript.

Sin embargo nuevo ECMAScript apoya computed property names, y se puede hacer:

var obj = { [varName]: varValue }; 
+4

¡Esto funciona! Gracias. Aunque todavía tengo curiosidad por qué la otra opción no funciona. –

+2

Porque generalmente cuando construyes objetos con un conjunto fijo de claves (que es lo que hace la sintaxis '{}') sabes cuáles son esas claves. La alternativa requeriría que todos los que quieran quieran claves fijas pongan comillas a su alrededor, lo que sería más trabajo para más personas más de las veces. – Dan

+0

También puede ver esta pregunta que acabo de responder: http://stackoverflow.com/questions/10631007/how-to-use-a-variable-as-a-key-inside-object-initialiser – HBP

17

A partir de ECMAScript 2015, lo que ha mejorado la compatibilidad con exploradores en el último año (s), puede utilizar la notación índice de variables:

var obj = { [varName] : varValue }; 

Este es sintácticamente el mismo que

var obj = {}; 
obj[varName] = varValue; 

También puede utilizar expresiones o símbolos como clave de propiedad:

var contact = { 
    company: companyName, 
}; 
var companiesWithContacts = { 
    [contact.company.toLowerCase()]: true 
}; 
var myList = { 
    [Symbol.iterator]: createIteratorForList 
}; 
function createIteratorForList() { ... } 
Cuestiones relacionadas