2013-11-07 4 views
179

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

Heres ситуация:

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

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, учитывая то, что я пытаюсь сделать?

ответ

503

В новом ES2015 standard для JavaScript (прежнее название ES6), объекты могут быть созданы с помощью вычисленных ключей: Object Initializer spec.

синтаксис:

var obj = { 
    [myKey]: value, 
} 

Применительно к сценарию ФП, он превратится в:

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

    callback(null, inputs); 
} 

Примечание: transpiler еще требуется для browser compatiblity.

Использование Babel или Google's traceur, возможно use this syntax today.


В более ранних спецификаций JavaScript (ES5 и ниже), ключ в виде литерала объекта всегда интерпретируется буквально, в виде строки.

Чтобы использовать "динамический" ключ, вы должны использовать bracket notation:

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

Отличное редактирование. Теперь, если ES6 можно просто официально опубликовать, мы могли бы сделать снимок мира во всем мире! :) – JDillon522

+0

Теперь вы можете использовать Compute Property Keys, если вы хотите использовать транспилер вроде Babel. Пример: https://babeljs.io/repl/#?экспериментальное = верно и оценки = истина & рыхлый = ложь и спецификации = ложь и код = Const% 20NAME% 20% 3D% 20'NAME '% 3B% 0A% 0Aconsole.log (% 7B% 0A% 20% 20% 5B'full' % 20% 2B% 20NAME % 5D% 3A% 20'Mike% 20Smith '% 0A% 7D)% 3B –

+0

Отличное обновление * вычисленных ключей *. Это то, что я ищу сегодня. Мне просто интересно, как вы узнали об этом «волшебстве». Чтение спецификационного документа ES2015 (так долго)? – haotang

24

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

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

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

+2

Я думаю, что в ES6 теперь вы можете сделать это: вар PROPNAME = 'thing' {[propname]: 5} -> {thing: 5} См. это для больше: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Object_initializer – Dtipson

Смежные вопросы