Массив JavaScript пар ключей/значений использует буквенное имя переменной для ключа

Я пытаюсь создать массив пар ключ/значение с помощью метода push, но получаю неожиданные результаты.

console.log печатает это:

books: [{ "bookTitle": "Mark Twain" }]

В то время как я ожидал бы этого:

книги: [{ "Том Сойер": "Марк Твен" }]

Здесь код:

var books = [];
var bookTitle = "Tom Sawyer";
var author = "Mark Twain";

books.push({bookTitle : author})

console.log("books: %s", JSON.stringify(books))

Я пробовал books.bookTitle = author и books[bookTitle] = author, но результат тот же. Любая помощь приветствуется.

Ответ 1

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

books[bookTitle] = author

Однако вам нужно использовать промежуточный объект:

var books = [];
var bookTitle = "Tom Sawyer";
var author = "Mark Twain";
var foo = {};
foo[bookTitle] = author;

books.push(foo);

console.log("books: %s", JSON.stringify(books))

Ответ 2

В современном Javascript (ES2015 +) вы можете использовать вычисленные свойства, который слегка модифицирует ваш пример кода - квадратные скобки обернуты вокруг ключевое имя для его обозначения должно быть вычислено перед назначением:

var books = [];
var bookTitle = "Tom Sawyer";
var author = "Mark Twain";

books.push({[bookTitle] : author})

... который правильно дает:

[{ "Том Сойер": "Марк Твен" }

Это похоже на исходный ответ Matt Ball, но избегает многословия использования временных переменных.