2013-08-28 3 views
11

Ich versuche, ein Array von Schlüssel/Wert-Paare mit der Methode push zu erstellen, aber unerwartete Ergebnisse zu erhalten.JavaScript Array von Schlüssel/Wert-Paaren verwendet Literal Variablenname für Schlüssel

console.log druckt diese:

Bücher: [{ "Buchtitel": "Mark Twain"}]:

Bücher:

Während ich dies erwarten würde [{ "Tom Sawyer": "Mark Twain"}]

Hier ist der Code :

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

books.push({bookTitle : author}) 

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

Ich habe books.bookTitle = author und books[bookTitle] = author versucht, aber das Ergebnis ist das gleiche. Jede Hilfe wird geschätzt.

+0

Beachten Sie, dass 'Bücher' ein Array ist, hätte die Klammernnotation funktioniert, wenn Sie es auf dem einzelnen Buch (' books [0] ') – Bergi

Antwort

22

Bracket notation der richtige Weg ist, einen dynamischen Schlüsselnamen zu verwenden:

books[bookTitle] = author 

Allerdings müssen Sie ein Zwischenobjekt verwenden:

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

aufgerufen hätten Genau - http://jsfiddle.net/rDSQH/ –

+0

Argh ! Ich hätte das ausprobieren sollen. Vielen Dank! – Raj

+0

Gibt es eine gute Begründung dafür, warum jscript so entworfen wurde? Ich finde das Design erschwerend. –

3

In modernen Javascript (ES2015 +), können Sie computed properties, die Ihren Beispielcode in einer leichten Weise ändert - eckige Klammern werden um den Schlüsselnamen gewickelt, um anzuzeigen, dass er berechnet werden sollte vor Zuweisung:

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

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

... die richtig ergibt:

[{ 'Tom Sawyer': 'Mark Twain'}

Dies ist ähnlich wie Matt Ball ursprüngliche Antwort, aber vermeidet die Ausführlichkeit Verwendung temporärer Variablen.

Verwandte Themen