JS-Array Problem mit 3 Ebenen
Ernst
- javascript
Hallo,
ich habe wahrscheinlich gerade ein Brett vorm Kopf, denn ich bekomme ein JS-Array mit 3 Ebenen nicht hin:
Ich möchte folgenden Beispielinhalt in einem Array abbilden:
Zwei Automodelle mit unterschiedlicher Anzahl Türen, unterschiedlichen Farben sollen dargestellt werden.
Meine Vorgehensweise war:
var auto = new array(new Array(), new Array(), new Array());
auto[0][3]['grün'] = "1000";
Der Wert 1000 wird also dem automodell 0 mit 3 Türen und der Farbe grün zugeordnet.
Leider ist die Struktur irgendwie falsch.
Mit 2 Ebenen klappts, so aber nicht.
ich hänge da irgendwie und komme echt nicht weiter (Brett vorm Kopf).
Kann mir da kurz einer helfen?
Was ist das falsch?
mfg Ernst
Erst mal gibt es new array(...) nicht, und selbst wenn man diesen Fehler korrigiert, bekommt man lediglich ein Array mit 3 leeren Arrays drin zurück.
Du solltest also gleich die komplette Struktur ausliefern:
auto = [ [ {'blau': 700, 'grün': 900}, {'blau': 850, 'rot': 270}, {'grün': 1000} ] ];
Das o.g. ist nur ein Beispiel, wobei für mich nicht so schlüssig ist, was die oberen Array-Strukturen abbilden sollen. Für mich würde vermutlich mehr Sinn ergeben, wenn man die Informationen nach Hersteller und Typenbezeichnung gruppieren würde, also:
autos = {
VW: {Golf: {'blau': 700}, Polo: {'rot': 850}},
Suzuki: {Swift: {'schwarz': 10000}}
};
Gruß, LX
Danke fürs Erste.
Folgendes funktioniert ja:
var array = new Array(new Array(), new Array());
array[0][0] = "100";
"alert(array[0][0]);" schmeisst 100 raus.
Ich will ja eigentlich in diese Struktur eine dritte Ebene reinbringen, weil ich die bestehende nur erweitern will.
Vielleicht doch ne Idee?
Lass Dich nicht von dem Beispiel mit dem Auto blenden, das war nur um das Ganze irgendwie plastischer zu machen.
mfG Ernst
Gern geschehen. Doch bin nicht ich es, der sich von Deinem Beispiel hat blenden lassen. Die richtige Antwort stand bereits in meinem Posting: Die 3. Ebene musst Du erst korrekt definieren - und das ist mit der Instanziierung von "[[],[],[]]" eben nicht geschehen, also nochmal in unnötig komplizierter Schreibweise:
array = [];
array[0] = [];
array[0][0] = [];
array[0][0][0] = 100;
alert(array[0][0][0]); // 100
Einfacher und kürzer wäre hier jedoch
array = [[[100]]];
Kleiner Bonus-Tip: Lerne JSON (JavaScript Object Notation), das wird Dir vieles vereinfachen. Außerdem solltest Du Dir dennoch Gedanken über die Strukturierung Deiner Daten machen. Zu komplexe Strukturen deuten üblicherweise auf einen Konzeptfehler hin.
Gruß, LX
Danke noch mal für das Feedback.
1.) Die Dateien liegen ähnlich bereits vor, deswegen ist es die schnellste Variante diese Notierung zu nehmen.
2.) JSON habe ich mir aufgrund von diversen Webservice natülich schon angeschaut, allerdings noch nicht vertieft.
Denke aber nicht, dass es mir in diesem Fall weiter hilft. ich arbeite gerade mit dem LIveCycle Designer von Adobe. Der kann sowiet ich weiss keine Objekt Notation
gruß Ernst
Hallo, Ernst.
Grundsätzlich gilt hier auf dem Forum: je genauer Du Dein Problem beschreibst, umso präziser können wir Dir auch antworten. Wenn ich es richtig sehe, kann der Lifecycle-Designer im Wesentlichen XML, welches mit relativer Leichtigkeit in ein JSON-Objekt umgewandelt werden kann.
Gruß, LX
Hallo,
Folgendes funktioniert ja:
var array = new Array(new Array(), new Array());
Damit erzeugst du ein Array, das zwei Arrays enthält.
array[0][0] = "100";
Damit weist du dem ersten Array Element im ersten enthaltenen Array einen Wert zu.
Deutlicher wird es so:
var inner1 = []; // [] ist gleichbedeutend new Array()
var inner2 = []; // [] ist gleichbedeutend new Array()
var outer = [inner1 , inner2];
// und das:
outer[0][0] = "100";
// bewirkt das gleiche wie
inner1[0] = "100";
// oder auch
inner1.push("100");
Was du aber willst, ist etwas wie:
var a =[[[[]]]]; // 3dimensionales Array
// bzw. ausführlicher:
var a =new Array(new Array(new Array(new Array()))); // 3dimensionales Array
a[0][0][0]='Wert';
alert(a[0][0][0]); // 'Wert' wird ausgegeben
Gruß, Don P
Hallo Don,
Was du aber willst, ist etwas wie:
var a =[[[[]]]]; // 3dimensionales Array
// bzw. ausführlicher:
var a =new Array(new Array(new Array(new Array()))); // 3dimensionales Array
a[0][0][0]='Wert';
alert(a[0][0][0]); // 'Wert' wird ausgegeben
das ist aber noch kein vollständiges 3D-Array. Man muss schon jedes "Unterarray" deklarieren:
~~~javascript
A = new Array(li); // 1D-Array der Größe li
for(var i=0;i<li;i++)
A[i] = new Array(lj); // 2D-Array der Größe li*lj
for(var i=0;i<li;i++)
for(var j=0;j<lj;j++)
A[i][j] = new Array(lk); // 3D-Array der Größe li*lj*lk
for(var i=0;i<li;i++)
for(var j=0;j<lj;j++)
for(var k=0;k<lk;k++)
A[i][j][k] = i*j*k ; // Zugriff auf 3D-Array
Gruß, Jürgen
Hi & Danke.
Hat mir weitergeholfen!
mfg Ernst
Hallo Ernst,
var auto = new array(new Array(), new Array(), new Array());
as ist ein Array von Arrays, also ein zweidimensionales Array. der Zugriff erfolgt per auto[i][j].
auto[0][3]['grün'] = "1000";
hier erwartest du ein dreidimensionales Array. Das erzeugt man so:
var auto = new Array(new Array(new Array() , new Array(), ...), new Array(new Array() , new Array(), ...), new Array(new Array() , new Array(), ...));
also ein Array von Arrays von Arrays. Hier wären verschachtelte Schleifen eine gute Wahl.
Gruß, Jürgen
auto[0][3]['grün'] = "1000";
hier erwartest du ein dreidimensionales Array.
Rein phänomenologisch ist das ein Objekt mit einer Eigenschaft 0, dessen Eigenschaft 3, dessen Eigenschaft grün. Auf der dritten Ebene ist nicht notwendig ein Array, sondern irgendein Objekt. Siehe <http://de.selfhtml.org/javascript/objekte/array.htm#assoziative_arrays@title=assoziative Arrays>.
Ich glaube, hier versucht Ernst PHP-Wissen auf JavaScript anzuwenden.
Das erzeugt man so:
auto = [
[
{},
{},
{},
{ 'grün' : '1234' }
]
];
... wäre ein mögliches minimales Konstrukt, das sich wie oben ansprechen lässt.
Übrigens: »new array« wird in JavaScript nicht funktionieren. Der Array-Konstruktor muss groß geschrieben werden.
Mathias
Hallo molily,
es können auf allen Ebenen Objekte oder Arrays gewählt werden, je nach Anwendung. Wichtig ist nur, dass auf den unteren Ebenen alle Elemente (Pointer?) deklariert werden.
[[[100]]] erzeugt nur ein 3D-Array der Größe 1*1*1.
Gruß, Jürgen