Массив 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, но избегает многословия использования временных переменных.