Creazione di oggetti con chiavi dinamiche

Prima di tutto, sto usando Cheerio per l’accesso al DOM e l’analisi con Node.js. Bei tempi.

Ecco la situazione:

Ho una funzione che ho bisogno di creare un object. Quell’object utilizza variabili sia per le sue chiavi che per i valori, quindi restituisce quell’object singolo. Esempio:

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); } 

Emette questo:

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

( .map() restituisce una matrice di oggetti fyi)

Ho bisogno di key per essere effettivamente la stringa da this.attr('name') .

Qual è il modo migliore per assegnare una stringa come chiave in Javascript, considerando quello che sto cercando di fare?

Nel nuovo standard ES2015 per JavaScript (precedentemente chiamato ES6), gli oggetti possono essere creati con chiavi calcolate : specifiche di Initializer dell’object .

La syntax è:

 var obj = { [myKey]: value, } 

Se applicato allo scenario dell’OP, si trasformsrebbe in:

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

Nota: per la compatibilità del browser è ancora necessario un transpiler.

Usando Babel o Google traceur , è ansible utilizzare questa syntax oggi .


Nelle specifiche JavaScript precedenti (ES5 e seguenti), la chiave in un object letterale viene sempre interpretata letteralmente, come una stringa.

Per usare una chiave “dynamic”, devi usare la notazione delle parentesi :

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

Nel tuo caso:

 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); } 

Non è ansible definire un object letterale con una chiave dynamic. Fai questo :

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

Non c’è scorciatoia (edit: ce n’è uno ora, con ES6, vedi l’altra risposta).