Как я могу интерполировать переменную как ключ в объекте JavaScript?

Если у меня есть:

var a = "whatever";
var b = {a : 20};
alert(b["a"]); // Shows 20

Как я могу вставить значение переменной a в качестве ключа, а не строку "a"? Я хочу сказать: b["whatever"] и вернуть это 20.

Предполагая этот код:

var a = "whatever";
var b = {a : 20};

Я спрашиваю, возможно ли после создания b содержать "whatever":20 вместо a:20. Может быть, можно использовать eval?

Ответ 1

var a = "whatever";
var b = {};
b[a] = 20;
alert(b["whatever"]); // shows 20

Ответ 2

Это работает в Firefox 39 и Chrome 44. Не знаю о других браузерах. Также он не работает в nodejs v0.12.7.

var a = "whatever";
var b = { [a]: 20 };
console.log(b["whatever"]); // shows 20

То есть, чтобы интерполировать переменную, заключите ее в скобки.

Я не уверен, что это часть любого стандарта. Первоначально я видел такой синтаксис здесь: https://hacks.mozilla.org/2015/07/es6-in-depth-classes/, где автор определил:

[functionThatReturnsPropertyName()] (args) { ... }

Я также не уверен, следует ли использовать этот синтаксис. Это не широко известно. Другие члены вашей команды могут не понимать код.

Ответ 3

Отличный вопрос. У меня было время попытаться понять это с подчеркиванием, но ответ не мог быть более простым:

var a = "whatever";
var b = {a : 20};

var array = [a, b]
var answer = _.object([[array]])// {whatever: {a:20}}//NOTICE THE DOUBLE SET OF BRACKETS AROUND [[array]]

Надеюсь, это поможет!

Ответ 4

var a = "whatever";
var b = {a : 20};
b[a] = 37;
alert(b["whatever"]); // 37

'a' - это строка со значением 'a'. a - это переменная со значением 'whatever'.

Ответ 5

Попробуйте следующее:

var a = "whatever";
var c = "something";
var b = {whatever : 20, something: 37};
alert(b[a]); // Shows 20
alert(b[c]); // Shows 37

Вот fiddle.

Или, если я правильно понимаю из приведенных ниже комментариев, попробуйте следующее:

var a = "whatever";
var b = {a : 20};
alert(b.a); // Shows 20

Ответ 6

Чтобы показать все параметры, я хочу указать CoffeeScript способ:

var a = "whatever";
var b = (
  obj = {},
  obj["" + a] = 20,
  obj
);

alert(b.whatever); // 20

Хотя я предпочитаю:

var a = "whatever";
var b = {};
b[a] = 20;

alert(b.whatever); // 20