Richardwa: Array

Ich brauche für ein Programm in Javaskript mehrere Arrays und habe sie durchnummeriert
z.Bsp
Test1 =new Array()
Test2 =new Array()
Test3 =new Array()
Test4 =new Array()

Im Programm wird anschließend die Zahl errechnet auf welches Array zugegriffen werden soll. (Z.Bsp. B=test+1 Es soll auf Test1 zugegriffen werden)

Nur die Zuweisung
B="Test"+Zahl
klappt nicht.

typeof gibt für
Test1 Objekt an
und für
B String an

Und beim Zugriff auf ein Element z.Bsp B[1] erfolgt die Fehlermeldung undefind.

Wie kann ich auf die Arrays zugreifen?

Danke für die Mühe
Richard

  1. hi,

    Ich brauche für ein Programm in Javaskript mehrere Arrays und habe sie durchnummeriert
    z.Bsp
    Test1 =new Array()
    Test2 =new Array()
    Test3 =new Array()
    Test4 =new Array()

    Warum erstellst du dir dann nicht ein Arry, welches diese Arrays enthält?

    Im Programm wird anschließend die Zahl errechnet auf welches Array zugegriffen werden soll. (Z.Bsp. B=test+1 Es soll auf Test1 zugegriffen werden)

    Das kannst du dir sparen, wenn du dir Arrays in einem Array ablegst.

    Nur die Zuweisung
    B="Test"+Zahl
    klappt nicht.

    Wieso nicht?
    Was ergibt alert(B)?

    typeof gibt für
    Test1 Objekt an
    und für
    B String an

    Natürlich.
    Hast du etwas anderes erwartet?
    Nur, weil du dir irgendeinen Textstring zusammensetzt, ergibt sich daraus doch nicht gleich eine Referenz auf ein Objekt, was wie der Textstringinhalt benannt ist.

    Und beim Zugriff auf ein Element z.Bsp B[1] erfolgt die Fehlermeldung undefind.

    Natürlich, B ist wie gesagt ein String.

    Das "Problem" wäre so, wie von dir gewünscht zwar auch lösbar (window["Test1"] wäre dein Array Test1) - aber die Arrays in einem Array abzulegen, dürfte der vernünftigere Weg sein.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. hi,

      Im Programm wird anschließend die Zahl errechnet auf welches Array zugegriffen werden soll. (Z.Bsp. B=test+1 Es soll auf Test1 zugegriffen werden)

      Das kannst du dir sparen, wenn du dir Arrays in einem Array ablegst.

      Wenn die Variablennamen exakt so aussehen: ja. Allerdings ist es hin und wieder am einfachsten sich die Adresse eines Speicherplatzes aus Namen zusammen zu basteln anstatt aus Zahlen. Insbesondere wenn sie aus einem komplexem Formular stammen ist es mit Namen deutlich übersichtlicher (man kann die Namen natürlich auch so bescheuert wählen, das sich dieser Vorteil in's Gegenteil verkehrt, zugegeben ;-).
      Generell verdammen würde ich sein Vorgehen also nicht unbedingt.
      Deshalb solltest Du evt Folgendes weiter ausführen.

      Das "Problem" wäre so, wie von dir gewünscht zwar auch lösbar (window["Test1"] wäre dein Array Test1) - aber die Arrays in einem Array abzulegen, dürfte der vernünftigere Weg sein.

      Ach was, ich soll auch am Montag nicht so faul sein, ich mach's eben ,-)

      Alle Objekt sind in einem großem Array namentlich festgehalten (nein, das ist natürlich etwas komplizierter, aber hier zuviel. Hat Christian Kruse dazu nicht mal einen Artikel darüber geschrieben?). Du kannst also jede Variable, Funktion u.ä. aus diesem Array heraus ansprechen:

        
      function test1(foo){  
        if(typeof(foo) == "number"){  
          foo = foo.toString(16);  
        }  
        alert("test1 with arg:\"" + foo + "\" called");  
      }  
      var variable1 = new Array("bar",1,"22");  
      var variable2 = 0xDEADBEEF;  
      var variable3 = "Hello World!";  
        
      for(var i=1;i<4;i++){  
        var tmp = "variable" + i.toString(10);  
        window["test1"](window[tmp]);  
      }  
      alert("tmp:"+tmp+"\ni:"+i);  
      
      

      so short

      Christoph Zurnieden

      1. Hallo,

        Das "Problem" wäre so, wie von dir gewünscht zwar auch lösbar (window["Test1"] wäre dein Array Test1) - aber die Arrays in einem Array abzulegen, dürfte der vernünftigere Weg sein.

        Ach was, ich soll auch am Montag nicht so faul sein, ich mach's eben ,-)

        Alle Objekt sind in einem großem Array namentlich festgehalten

        Was hat das jetzt mit wahsagas Posting zu tun? (Eine ganz allgemeine Anmerkung? Ok.)
        Wahsaga meinte ganz einfach verschachtelte Arrays. Dein Code ist keine Umsetzung von wahsagas Idee. (Falls du es nicht sowieso nicht so meintest, als Hinweis an den OP.)

        var Test = new Array(  
           new Array(1, 2, 3),  
           new Array("x", "y", "z"),  
           ...  
        );  
        var i = 1;  
        alert( Test[i] );
        

        Den »großen Array« gibt es auch nicht, das kann man höchstens im übertragenen Sinne sagen (»die Unterobjekte lassen sich so ansprechen, wie es aus anderen Programmiersprachen von assoziativen Arrays bekannt ist«). Mit echten Arrays in JavaScript hat das aber gar nichts gemein. Es ist einfach eine Schreibweise zum Ansprechen von Unterobjekten. Bitte nicht die Begriffe völlig durcheinanderwerfen.

        Mathias

        1. hi,

          Wahsaga meinte ganz einfach verschachtelte Arrays.

          Das hatte Christoph wohl schon verstanden, darauf ging er ja auch weiter oben in seinem Posting ein - u.a. mit Ausführungen dazu, warum er das u.U. für weniger angebracht halten würde.

          Dein Code ist keine Umsetzung von wahsagas Idee.

          Darauf bezog er sich auch nicht, sondern darauf, dass ich die Möglichkeit, über window.[Eigenschaft-/Objektname] zuzugreifen, schon beiläufig erwähnt hatte - das wollte er noch mal ein bisschen ausführlicher darstellen, da er wohl der Meinung ist, es helfe/hülfe(?)(hilfe!) dem Frager am ehesten weiter.

          gruß,
          wahsaga

          --
          /voodoo.css:
          #GeorgeWBush { position:absolute; bottom:-6ft; }
          1. Hi,

            Dein Code ist keine Umsetzung von wahsagas Idee.

            Darauf bezog er sich auch nicht, sondern darauf, dass ich die Möglichkeit, über window.[Eigenschaft-/Objektname] zuzugreifen, schon beiläufig erwähnt hatte - das wollte er noch mal ein bisschen ausführlicher darstellen, da er wohl der Meinung ist, es helfe/hülfe(?)(hilfe!)

            (Ich glaube 'helfe', sicher bin ich mir da aber auch nicht ;-)

            dem Frager am ehesten weiter.

            Noch nicht einmal das, ich wollte nur -- ganz unschuldig! -- die von Dir nur angerissene Alternative etwas weiter ausführen. Insbesondere bei Funktionen kann man das hin und wieder gut gebrauchen, es spart Code und ist übersichtlicher (klar, ist etwas Geschmacksache mit drin). Mal ein Beispiel aus meiner Praxis (Namen von der Redaktion zum Schutz der Schuldigen geändert ;-).

            Es gibt eine Auswahliste:

              
            <select name="selOperator" id="selOperator" size="1">  
            <option value="add" selected="selected">Addieren</option>  
            <option value="sub" >Subtrahieren</option>  
            <option value="mul" >Multiplizieren</option>  
            <option value="div" >Dividieren</option>  
            <option value="mod" >Modulo</option>  
            
            

            Diese Auswahlliste wird per Javascript verarbeitet. Die jeweiligen Funktionen sind dabei namensgleich zu den Werten der einzelnen Optionen. Daher bietet sich folgendes an:

              
            function add(foo,bar){  
              return foo + bar;  
            }  
            //[...]  
            function mod(foo,bar){  
              return foo % bar;  
            }  
              
            function processOptions(){  
              //[...]  
              var optionsNode     = document.testformular.selOperator;  
              var choosenOption   = optionsNode.options.selectedIndex;  
              var choosenOperator = optionsNode.options[choosenOption].value;  
              //[...]  
              var result = window[choosenOperator](bla,blub);  
              //[...]  
            }  
            
            

            Das meiste[1] andere (ein switch(), if/else etc) wäre eine völlig unnötige Vermehrung der Codekomplexität inklusive der damit verbundenen Erhöhung der Fehleranfälligkeit.

            so short

            Christoph Zurnieden

            [1] ich kenne allerdings keine geschicktere Lösung

          2. Hallo,

            Dein Code ist keine Umsetzung von wahsagas Idee.

            Darauf bezog er sich auch nicht

            Ah, ok.

            sondern darauf, dass ich die Möglichkeit, über window.[Eigenschaft-/Objektname] zuzugreifen, schon beiläufig erwähnt hatte - das wollte er noch mal ein bisschen ausführlicher darstellen, da er wohl der Meinung ist, es helfe/hülfe(?)(hilfe!) dem Frager am ehesten weiter.

            (»Hälfe« oder »hülfe«.)

            Mathias

            1. da er wohl der Meinung ist, es helfe/hülfe(?)(hilfe!) dem Frager am ehesten weiter
              (»Hälfe« oder »hülfe«.)

              Korrektur: Beides ist möglich. Natürlich nimmt man bei indirekter Rede erst einmal Konjunktiv I (»helfe«). Wenn man sich vom gesagten distanzieren will oder es in Frage steht, Konjunktiv II (»hälfe« oder »hülfe«). Ich tendiere wie gesagt eher zu »hülfe«. ;)

              Mathias

              1. Hi,

                Korrektur: Beides ist möglich.

                und das Dritte ist üblich: die Umschreibung mit "würde".
                (Da besitze ich doch tatsächlich einen aktuellen(!) Duden? Sachen gibt's! ;-)

                so short

                Christoph Zurnieden