2012-05-17 2 views
31

Я пытаюсь создать объект словаря, как такКлюч для словаря Javascript не сохраняется в качестве значения, но в качестве имени переменной

var obj = { varName : varValue }; 

Что я ожидаю есть если varName='foo', то OBJ должно быть {'foo', 'some value' } однако, что Я вижу, {varName, 'some value'} значение переменной не используется, но имя переменной в качестве ключа. Как сделать так, чтобы в качестве ключа использовалось значение переменной?

+0

возможного дубликат [Как использовать переменный в качестве ключа внутри объект Инициализатором] (http://stackoverflow.com/questions/ 10631007/how-to-use-a-variable-as-a-key-inside-object-initialiser) – zzzzBov

ответ

63

Попробуйте так:

var obj = {}; 
obj[varName] = varValue; 

Вы не можете инициализировать объекты с 'динамическими' ключами в старом JavaScript. var obj = { varName : varValue }; эквивалентен var obj = { "varName" : varValue };. Так интерпретируется Javascript.

Однако новый ECMAScript поддерживает computed property names, и вы можете сделать:

var obj = { [varName]: varValue }; 
+4

Это работает! Благодарю. Хотя мне все еще интересно, почему другой способ не работает. –

+2

Потому что, как правило, когда вы создаете объекты с фиксированным набором ключей (это то, что делает синтаксис '{}', вы знаете, что это за клавиши. Альтернатива потребует от всех, кто не хочет, чтобы фиксированные ключи помещали кавычки вокруг них, что было бы больше работать для большего количества людей больше времени. – Dan

+0

Вы также можете увидеть этот вопрос, на который я только что ответил: http://stackoverflow.com/questions/10631007/how-to-use-a-variable-as-a-key-inside-object-initialiser – HBP

17

Начиная с ECMAScript 2015, которая получила улучшенную поддержку браузера в прошлом году (ы), вы можете использовать переменную индексное обозначение:

var obj = { [varName] : varValue }; 

Это синтаксически такой же, как

var obj = {}; 
obj[varName] = varValue; 

Вы также можете использовать выражение или символы в качестве ключа свойства:

var contact = { 
    company: companyName, 
}; 
var companiesWithContacts = { 
    [contact.company.toLowerCase()]: true 
}; 
var myList = { 
    [Symbol.iterator]: createIteratorForList 
}; 
function createIteratorForList() { ... } 
Смежные вопросы