Создание объекта с помощью динамических клавиш

Во-первых, я использую Cheerio для некоторого доступа DOM и синтаксического анализа с помощью Node.js. Хорошие времена.

Вот такая ситуация:

У меня есть функция, которая мне нужна для создания объекта. Этот объект использует переменные как для своих ключей, так и для значений, а затем возвращает этот единственный объект. Пример:

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() возвращает массив объектов fyi)

Мне нужно key, чтобы на самом деле была строка из this.attr('name').

Каким образом можно назначить строку в качестве ключа в Javascript, учитывая то, что я пытаюсь сделать?

Ответ 1

В новом стандарте ES2015 для JavaScript (ранее называвшемся ES6) объекты могут быть созданы с помощью вычисленных ключей: Инициализатор объектов спецификации.

Синтаксис:

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

Ответ 2

Вы не можете определить литерал объекта динамическим ключом. Сделайте это:

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

Нет ярлыка (отредактируйте: там теперь, с ES6, см. другой ответ).