Cómo establecer un nombre de propiedad de objeto JS a partir de una variable


178

Necesito establecer un nombre de propiedad de objeto JS dinámicamente.

for(i=1; i<3; i++) {
    var key  = i+'name';

    data = {
        key : 'name1',
    }
}

El resultado debe ser:

data = {
    1name: 'name1'
    2name: 'name1'
}

Si son secuenciales, ¿por qué no está utilizando una matriz?
— epascarello

Quiero saber cuáles de ustedes tres dieron en la flecha equivocada. Vamos, confiesa.
— Charles

Respuestas:


194
var jsonVariable = {};
for(var i=1; i < 3; i++) {
  jsonVariable[i + 'name'] = 'name' + i;        
}

44
La siguiente respuesta de Musa también articula correctamente que usar la notación [] es en realidad la única forma de hacerlo.
— Dennis Plucinik

1
También tenga en cuenta que la respuesta de @ ChilNut a continuación ahora describe la forma más fácil de hacer esto usando ES6
— rambossa

1
En realidad, con la nueva sintaxis, lo que OP está tratando de lograr solo será posible si el límite del bucle está codificado y es pequeño.
— Musa

168

Tendrá que usar la []notación para establecer claves dinámicamente.

var jsonVariable = {};
for(i=1; i<3; i++) {        
 var jsonKey  = i+'name';
 jsonVariable[jsonKey] = 'name1';

}

Ahora en ES6 puede usar la sintaxis literal de objetos para crear claves de objetos dinámicamente, simplemente ajuste la variable en []

var key  = i + 'name';
data = {
    [key] : 'name1',
}

3
jsonVariable = {}; no debe inicializarse dentro del ciclo for.
— cierre

También estás haciendo que jsonVariable sea global aquí
— Dennis Plucinik

130

Con ECMAScript 6, puede usar nombres de propiedades variables con la sintaxis literal del objeto, como esta:

var keyName = 'myKey';
var obj = {
              [keyName]: 1
          };
obj.myKey;//1

Esta sintaxis está disponible en los siguientes navegadores más nuevos:

Edge 12+ (Sin compatibilidad con IE), FF34 +, Chrome 44+, Opera 31+, Safari 7.1+

( https://kangax.github.io/compat-table/es6/ )

Puede agregar soporte a navegadores antiguos utilizando un transpilador como babel . Es fácil transpilar un proyecto completo si está utilizando un paquete de módulos como rollup o webpack .


2
Gracias por agregar la increíble sintaxis de ES6
— rambossa

Sin ES6 no puedo definir var payload = {dynamicKey: val}, necesito hacer var payload = {} y payload [variableName] = val.
— Sainath SR

23

Esta es la forma de establecer dinámicamente el valor

var jsonVariable = {};
for (var i = 1; i < 3; i++) {
    var jsonKey = i + 'name';
    jsonVariable[jsonKey] = 'name' + i;
}


7

No importa de dónde viene la variable. Lo principal que tenemos es ... Establecer el nombre de la variable entre corchetes "[..]".

var optionName = 'nameA';
var JsonVar = {
[optionName] : 'some value'
}

Esto funciona bien, me pregunto si funciona en todos los navegadores / versiones
— Mercury

1
jsonVariable = {}
for(i=1; i<3; i++) {        
   var jsonKey  = i+'name';
   jsonVariable[jsonKey] = 'name1'
}

esto será similar a

    jsonVariable = {
    1name : 'name1'
    2name : 'name1'
}

0

En la línea del comentario anterior de Sainath SR, pude establecer un nombre de propiedad de objeto js a partir de una variable en Google Apps Script (que todavía no admite ES6) definiendo el objeto y luego definiendo otra clave / valor fuera del objeto:

var salesperson = ...

var mailchimpInterests = { 
        "aGroupId": true,
    };

mailchimpInterests[salesperson] = true;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.