2013-08-28 119 views
11

我试图通过使用push方法创建一个键/值对的数组,但获得意外的结果。JavaScript数组键/值对使用文字变量名作为键

console.log打印此:

书:[{ “BOOKTITLE”: “马克·吐温”}]

尽管我希望这样的:

书:[{ “汤姆索亚”:“马克吐温”}]

这是代码:

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

books.push({bookTitle : author}) 

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

我试过books.bookTitle = authorbooks[bookTitle] = author,但结果是一样的。任何帮助表示赞赏。

+0

请注意,'books'是一个数组,如果你在单本书('books [0]')上调用它,括号表示法就可以正常工作 – Bergi

回答

22

Bracket notation是使用动态密钥名称的正确方法:

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)) 
+0

正确 - http://jsfiddle.net/rDSQH/ –

+0

Argh !我应该尝试过。谢谢! – Raj

+0

为什么jscript是这样设计的吗?我发现设计加剧。 –

3

在现代的Javascript(ES2015 +),你可以使用computed properties它以一种轻微的方式修改您的示例代码 - 方括号缠在密钥名称周围以表示它应该被计算之前作业:

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

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

...它正确地产生:

[{ '汤姆·索亚': '马克·吐温'}

这与马特·鲍尔的原来的答案,但避免了冗长使用临时变量。