molily: Javascript-Array in JSON-String umwandeln

Beitrag lesen

Was mache ich falsch? Oder habe ich irgendwas grundsätzlich falsch verstanden?

Ja. Es gibt keine »assoziativen Arrays« in JavaScript.

JavaScript kennt Objekte und alles ist ein Objekt (bzw. kann sich wie eines verhalten). Objekte sind Zuordnungslisten, die unter gewissen Namen gewisse Werte speichern. Diese Einträge nennt man (Objekt-)Eigenschaften. In anderen Programmiersprachen wird eine solche Datenstruktur Hash genannt. In PHP beispielsweise gibt es keine Trennung zwischen Hashes und rein numerischen Arrays. In JavaScript gibt es zwar auch keine, aber es ist trotzdem anders.

Beispiel für einen Objekt-Literal (Kurzschreibweise zum Erzeugen von generischen Object-Objekten):

var o = {  
   eigenschaft : 'wert'  
};

JavaScript kennt ferner Arrays. Arrays sind auch nur Objekte, besitzen also Eigenschaften und Werte. Was sie von allgemeinen Objekten unterscheidet, ist, dass sie i.d.R. nur numerische Eigenschaften haben. Die Eigenschaften heißen also '0', '1', '2', '3' usw. Die Standardmethoden von Arrays operieren jedenflls nur auf diesen Eigenschaften.

Du *kannst* einem Array natürlich weitere Eigenschaften anhängen - das tust du in deinem Beispiel. Diese können auch anders heißen, aber sie sind bloß irgendwelche Objekteigenschaften und werden *nicht* als Elemente des Arrays gezählt.

Wenn du jetzt JSON.stringify() auf einen Array loslässt, dann beachtet diese Methode nur die Eigenschaften, die numerisch sind. Es durchläuft den Array mit for (var i = 0, l = array.length; i < l; i++) oder ähnlich. Dabei werden nicht-numerische Eigenschaften, die das Objekt zusätzlich haben mag, nicht gefunden - und tauchen in der Serialisierung nicht auf. Sie könnten es auch nicht, weil der Array-Literal, der erzeugt wird, deren Serialisierung nicht zulässt.

Also entweder ein Array mit drei Elementen:

var array = ['foo', 'bar', 'quux'];  
alert(array[0] + ' ' + array[1] + ' ' + array[2]);  
alert(JSON.stringify(array)); // gibt ["foo","bar","quux"] aus

Oder ein generisches Objekt mit drei Eigenschaften:

var object = {  
  foo : 'wert1',  
  bar : 'wert2',  
  quux : 'wert3'  
};  
alert(object.foo);  
alert(JSON.stringify(object)); // Gibt {"foo":"wert1","bar":"wert2","quux":"wert3"} aus

Das suchst du also.

Weiter Erklärungen:
http://de.selfhtml.org/javascript/objekte/array.htm#assoziative_arrays (dort steht eigentlich alles, was ich oben geschrieben habe)
http://aktuell.de.selfhtml.org/artikel/javascript/organisation/#object-literale
http://molily.de/js/organisation-module.html#object-literal

M.