Comment définir un nom de propriété d'objet JS à partir d'une variable


178

J'ai besoin de définir dynamiquement un nom de propriété d'objet JS.

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

    data = {
        key : 'name1',
    }
}

Le résultat doit être:

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

S'ils sont séquentiels, pourquoi n'utilisez-vous pas un tableau?
epascarello

Je veux savoir lesquels de vous trois ont frappé la mauvaise flèche. Allez, avoue.
Charles

Réponses:


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

4
La réponse de Musa ci-dessous exprime également correctement que l'utilisation de la notation [] est en fait la seule façon de le faire.
Dennis Plucinik

1
Notez également que la réponse de @ ChilNut ci-dessous décrit maintenant la façon la plus simple de le faire en utilisant ES6
rambossa

1
En fait, avec la nouvelle syntaxe, ce qu'OP essaie de réaliser ne sera possible que si la limite de boucle est codée en dur et petite.
Musa

168

Vous devrez utiliser la []notation pour définir les clés de manière dynamique.

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

}

Maintenant, dans ES6, vous pouvez utiliser la syntaxe littérale d'objet pour créer des clés d'objet dynamiquement, il suffit d'envelopper la variable dans []

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

3
jsonVariable = {}; ne doit pas être initialisé dans la boucle for.
fermeture

Vous rendez aussi jsonVariable global ici
Dennis Plucinik

130

Avec ECMAScript 6, vous pouvez utiliser des noms de propriété de variable avec la syntaxe littérale d'objet, comme ceci:

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

Cette syntaxe est disponible dans les nouveaux navigateurs suivants:

Edge 12+ (pas de support IE), FF34 +, Chrome 44+, Opera 31+, Safari 7.1+

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

Vous pouvez ajouter une prise en charge aux navigateurs plus anciens en utilisant un transpilateur tel que babel . Il est facile de transpiler un projet entier si vous utilisez un bundler de modules tel que rollup ou webpack .


2
Merci d'avoir ajouté la superbe syntaxe
ES6

Sans ES6, je ne peux pas définir var payload = {dynamicKey: val}, je dois faire var payload = {} et payload [variableName] = val.
Sainath SR

23

C'est la façon de définir dynamiquement la valeur

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


7

Peu importe d'où vient la variable. La principale chose que nous en avons un ... Définissez le nom de la variable entre crochets "[..]".

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

Cela fonctionne bien, je me demande si cela fonctionne dans tous les navigateurs / versions
Mercury

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

ce sera similaire à

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

0

Dans le sens du commentaire de Sainath SR ci-dessus, j'ai pu définir un nom de propriété d'objet js à partir d'une variable dans Google Apps Script (qui ne prend pas encore en charge ES6) en définissant l'objet puis en définissant une autre clé / valeur en dehors de l'objet:

var salesperson = ...

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

mailchimpInterests[salesperson] = true;
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.