2013-08-28 159 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}) 

...它正確地產生:

[{ '湯姆·索亞': '馬克·吐溫'}

這與馬特·鮑爾的原來的答案,但避免了冗長使用臨時變量。