Ernst: JS-Array Problem mit 3 Ebenen

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

  1. 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

    --
    RFC 2324, Satz 7 (Sicherheit): Jeder, der zwischen meinem Kaffee und mir steht, gilt als unsicher.
    1. 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

      1. 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

        --
        RFC 2324, Satz 7 (Sicherheit): Jeder, der zwischen meinem Kaffee und mir steht, gilt als unsicher.
        1. 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

          1. 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

            --
            RFC 2324, Satz 7 (Sicherheit): Jeder, der zwischen meinem Kaffee und mir steht, gilt als unsicher.
      2. 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

        1. 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

        2. Hi & Danke.
          Hat mir weitergeholfen!
          mfg Ernst

  2. 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

    1. 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

      1. 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