398

まず、DOM アクセスと Node.js による解析にCheerioを使用しています。良い時代。

状況は次のとおりです。

オブジェクトを作成するために必要な関数があります。そのオブジェクトは、キーと値の両方に変数を使用し、その単一のオブジェクトを返します。例:

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

これは次のように出力されます。

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

(.map()オブジェクトの配列を返します)

私はkey実際に からの文字列である必要がありますthis.attr('name')

私がやろうとしていることを考えると、Javascriptで文字列をキーとして割り当てる最良の方法は何ですか?

4

2 に答える 2

1055

JavaScriptの新しいES2015 標準(以前は ES6 と呼ばれていました) では、計算されたキーを使用してオブジェクトを作成できます: Object Initializer spec

構文は次のとおりです。

var obj = {
  [myKey]: value,
}

OPのシナリオに適用すると、次のようになります。

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

  callback(null, inputs);
}

注:ブラウザーの互換性のためにトランスパイラーが引き続き必要です。

BabelまたはGoogle の traceurを使用すると、現在この構文を使用できます。


以前の JavaScript 仕様 (ES5 以下) では、オブジェクト リテラルのキーは常に文字通り、文字列として解釈されます。

「動的」キーを使用するには、ブラケット表記を使用する必要があります。

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

あなたの場合:

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);
}
于 2013-11-07T14:05:32.997 に答える
62

動的キーを使用してオブジェクト リテラルを定義することはできません。これを行う :

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

ショートカットはありません (編集: 現在、ES6 ではショートカットがあります。他の回答を参照してください)。

于 2013-11-07T14:04:41.227 に答える