web-dev-qa-db-fra.com

Création d'objet avec des clés dynamiques

Tout d'abord, j'utilise Cheerio pour certains accès DOM et l'analyse avec Node.js. Bon temps.

Heres la situation:

J'ai une fonction dont j'ai besoin pour créer un objet. Cet objet utilise des variables pour ses clés et ses valeurs, puis renvoie cet objet unique. Exemple:

stuff = function (thing, callback) {
  var inputs  = $('div.quantity > input').map(function(){
    var key   = this.attr('name')
     ,  value = this.attr('value');

     return { key : value }
  }) 

  callback(null, inputs);
}

Il génère ceci:

[ { key: '1' }, { key: '1' } ]

(.map() retourne un tableau d'objets fyi)

J'ai besoin de key pour être la chaîne de this.attr('name').

Quel est le meilleur moyen d'affecter une chaîne en tant que clé en Javascript, compte tenu de ce que j'essaie de faire?

295
JDillon522

Dans la nouvelle version norme ES2015 pour JavaScript (anciennement appelée ES6), les objets peuvent être créés avec des clés calculées : spéc. D'initialisation d'objet .

La syntaxe est la suivante:

var obj = {
  [myKey]: value,
}

Si appliqué au scénario du PO, il se transformerait en:

stuff = function (thing, callback) {
  var inputs  = $('div.quantity > input').map(function(){
    return {
      [this.attr('name')]: this.attr('value'),
    };
  }) 

  callback(null, inputs);
}

Remarque: Un transpiler est toujours requis pour compatibilité du navigateur .

En utilisant Babel ou le traqueur de Google , il est possible de tiliser cette syntaxe aujourd'hui .


Dans les spécifications JavaScript antérieures (ES5 et versions antérieures), la clé d'un littéral d'objet est toujours interprétée littéralement, en tant que chaîne.

Pour utiliser une clé "dynamique", vous devez utiliser la notation entre crochets :

var obj = {};
obj[myKey] = value;

Dans ton cas:

stuff = function (thing, callback) {
  var inputs  = $('div.quantity > input').map(function(){
    var key   = this.attr('name')
     ,  value = this.attr('value')
     ,  ret   = {};

     ret[key] = value;
     return ret;
  }) 

  callback(null, inputs);
}
778
Renato Zannon

Vous ne pouvez pas définir un littéral d'objet avec une clé dynamique. Faire ceci:

var o = {};
o[key] = value;
return o;

Il n'y a pas de raccourci (éditer: il y en a un maintenant, avec ES6, voir l'autre réponse).

35
Denys Séguret