Mssmar: Dynamisch Variablen generieren/erstellen

Hallo,

Problem:

ich versuche durch die Zhälvariable: "i" den Namen der Variable "q1a" immer eine Zahl dahinter einfügen so, dass ich am Ende folgende Variablen bekomme:

q1a1, q1a2, q1a3, q1a4 uzw.

Fehler: 'q1a1' ist undefiniert

Das ist auch richtig so, da die "q1a1" nirgendwo als Variable deklariert bzw. definiert wird.

Mit dem folgenden Skript , bekomme ich zwar mit alert den Inhalt der Variable: variables[i], was auch mir folgendes ausgibt: q1a1, aber es wird nicht als Variable erkannt.

Wie kann ich das bitte hin bekommen?

Vielen Dank und Gruß
Messmar

[code]
<script>
<!--
var variables = new Array()

for (i=1; i<10; i++) {

variables[i] = "var q1a" + i;
   alert(variables[i]);
   alert(q1a1);
}
//-->
</script>
[code lang=html]

  1. Hi,

    ich versuche durch die Zhälvariable: "i" den Namen der Variable "q1a" immer eine Zahl dahinter einfügen so, dass ich am Ende folgende Variablen bekomme:

    q1a1, q1a2, q1a3, q1a4 uzw.

    Aus welchem Grund verwendest du nicht einfach ein Array?

    mfG,
    steckl

    1. Hi,

      Danke schon Mal.

      Aus welchem Grund verwendest du nicht einfach ein Array?

      Weil ich einfach ca. über 50 Stück brauche.

      und das hier: "var variables = new Array()" habe schon und mit der For-Schleife und der Zählvaribale dachte ich musste reichen oder verstehe ich falsch?

      Gruß
      Messmar

      1. Hi,

        Aus welchem Grund verwendest du nicht einfach ein Array?
        Weil ich einfach ca. über 50 Stück brauche.

        An einem Array mit 50 Elementen sehe ich nichts schlimmes.

        und das hier: "var variables = new Array()" habe schon und mit der For-Schleife und der Zählvaribale dachte ich musste reichen oder verstehe ich falsch?

        Du kannst in jedes einzelne Array-Element das gleiche wie in eine einzelne Variable schreiben. Du kannst ja das was du abspeichern willst beispielsweise in variables[0], bzw. variables[i] abspeichern.

        Oder verstehe ich dein Problem falsch?

        mfG,
        steckl

        1. Hi,

          Oder verstehe ich dein Problem falsch?

          Ich glaube schon ;-((

          ich will folgendes erreichen:

          var q1a1, q1a2, q1a3 uzw.

          oder:

          var q1a1;
          var q1a2;
          var q1a3;
          uzw.

          also, die Deklaration von der Variablen (Dass es sie überhaupt gibt), selbst soll dynamisch passieren bzw. stattfinden .

          Das was ich in der Variable speichere tue ich natürlich mit nem weiteren Array und weise ich dann die Werte der Variablen zu.

          Gruß
          Messmar

          1. Hi,

            ich will folgendes erreichen:

            var q1a1, q1a2, q1a3 uzw.

            Ich sehe hierin keinen Vorteil im Gegensatz zu einem Array, wenn die Variablen eh der Reihe nach durchnummeriert sind.
            Das ist ja das gleiche wie q1a[1], q1a[2], q1a[3], ...

            also, die Deklaration von der Variablen (Dass es sie überhaupt gibt), selbst soll dynamisch passieren bzw. stattfinden .

            Das würde mit eval() gehen. Du kannst dann beispielsweise schreiben:
            eval("var a1q"+1);
            Aber wie gesagt, ich halte es für nicht sinnvoll.

            Das was ich in der Variable speichere tue ich natürlich mit nem weiteren Array und weise ich dann die Werte der Variablen zu.

            Warum speicherst du es erst in die Variablen, wenn du es später wieder in ein Array speichern willst.

            mfG,
            steckl

            1. Hi,

              Du kannst dann beispielsweise schreiben:

              eval("var a1q"+1);
              Aber wie gesagt, ich halte es für nicht sinnvoll.

              Ich stimme dir zu, bloß wusste ich nicht, wie ich es anders erreichen kann.

              Aber mit eval(), kann ich schon Mal leben ;-) Die funkt. habe vorher schon dran gedacht/versucht, aber leider nen Syntax-Fehler dabei gehabt. und irgendwie ist heute nicht mein Tag ;-(

              Danke und Gruß
              Messmar

              1. Hallo,

                Das was ich in der Variable speichere tue ich natürlich mit nem weiteren Array und weise ich dann die Werte der Variablen zu.

                Du hast also ein Array1 gefüllt mit Namen und ein weitres Array2 gefüllt mit Werten, und deklarierst dann verschiedene Variablen mit den Namen aus Array1, die dann mit den einzelnen Werten aus Array2 gefüllt werden?

                Schwer zu verstehen, warum man so umständlich vorgehen sollte. Wie @steckl schon schrieb, wäre es doch viel einfacher, ein einziges Array names q1a zu deklarieren, und die i Werte dann direkt in den Arrayelementen q1a[i] abzulegen.

                eval() ist nicht zu empfehlen. "eval is evil" (eval ist böse) ist schon zum geflügelten Wort geworden.

                Du kannst auch eine Funktion definieren und dann aufrufen:

                var myFunc = new Function(" this.q1a" + 1 + "= " + wert1 + ", this.q1a" + 2 + "= " + Wert2 +";");
                myFunc();

                Dann sind q1a1 und q1a2 definiert. Ist aber auch seeehr umständlich, verglichen mit einem einzigen Array.

                Gruß, Don P

                1. Hallo,

                  eval() ist nicht zu empfehlen. "eval is evil" (eval ist böse) ist schon zum geflügelten Wort geworden.

                  Vielen Dank für die ausführliche Erklärung und eure Hilfe.

                  ich habe es jetzt folgendermaßen gelöst und zwar mit Hilfe von Google und einem Forum:

                    
                  <script>  
                  <!--  
                  var q1a = new Array(100);  
                    
                  for (var i=1;i<=q1a.length;i++) {  
                   var QA = '"xyzQ1A';  
                   window['q1a'+i]='<c:set sequence="grp"><c:out key="group.PrName" data=' + QA + i + '"><dom:body key="group.PrValue" />';  
                  }  
                    
                  alert("Erste Frage und Antwort: \n" + q1a1);  
                  alert("vierte Frage und Antwort: \n" + q1a4);  
                    
                  //-->  
                  </script>  
                  
                  

                  Aber offen gesagt, weiße ich nicht genau was das mit window[....] zu bedeuten hat.
                  Etwas ausführliches darüber zu lesen online, finde ich leider nicht.

                  Gruß
                  Messmar

                  1. ich habe es jetzt folgendermaßen gelöst und zwar mit Hilfe von Google und einem Forum:

                    Das ist Unsinn.

                    [code lang=html]
                    <script>

                    Naja, du weißt was hier fehlt.

                    <!--
                    var q1a = new Array(100);

                    Hier hast du ein Array.

                    for (var i=1;i<=q1a.length;i++) {
                    var QA = '"xyzQ1A';
                    window['q1a'+i]='<c:set sequence="grp"><c:out key="group.PrName" data=' + QA + i + '"><dom:body key="group.PrValue" />';

                    und statt das du das Array benutzt erzeugst du globale Variabeln mit den Man qla1 bis qla100

                    Das ergibt keinen Sinnn, warum benutzt du nicht das Array?

                    Struppi.

                    1. ich habe es jetzt folgendermaßen gelöst und zwar mit Hilfe von Google und einem Forum:

                      Das ist Unsinn.

                      [code lang=html]
                      <script>

                      ... gebe dir Recht. Ist mit auch aufgefallen aber wusste nicht (habe es auch vergessen), wie ich es anders mache, damit ich den Code vom normalen Fließtext unterscheide.

                      Das ergibt keinen Sinnn, warum benutzt du nicht das Array?

                      wenn ich das Array hier benutze, dann muss ich mit eval() arbeiten, und machte/macht mir das Leben schwer. habe diese Lösung genommen und die gibt mir das gewünschte Ergebnis.

                      Aber für nen besseren Tipp, bin wie immer sehr Dankbar.

                      Gruß
                      Messmar

                      1. Das ergibt keinen Sinnn, warum benutzt du nicht das Array?

                        wenn ich das Array hier benutze, dann muss ich mit eval() arbeiten, und machte/macht mir das Leben schwer.

                        Das ist doch Blödsinn, warum machst du es nicht so:

                        var q1a = new Array(100);  
                          
                        for (var i=1;i<=q1a.length;i++) {  
                         var QA = '"xyzQ1A';  
                         q1a[i] ='<c:set sequence="grp"><c:out key="group.PrName" data=' + QA + i + '"><dom:body key="group.PrValue" />';  
                        }
                        

                        Struppi.

                        1. Hi,

                          Das ist doch Blödsinn, warum machst du es nicht so:

                          [...]

                          Du wirst mir es nicht glauben, aber haben sie versucht das Skript auszuführen?

                          wenn ich es versuche, dann stürzt mein Editor ab und verabschiedet sich. Ich kann es dann nur mit dem Task Manager schließe und dann wieder starten ;-(((

                          Genau das hatte ich gestern und daher entschiede ich mich für die andere Variante.

                          Keine Ahnung, warum so was passiert.

                          Gruß
                          Messmar

                          1. Hi,

                            Das ist doch Blödsinn, warum machst du es nicht so:
                            [...]

                            Du wirst mir es nicht glauben, aber haben sie versucht das Skript auszuführen?

                            Nein, aber jetzt ja, da sind auch Fehler drin, ich hab das nur von dir kopiert.

                            var QA = '"xyzQ1A';  
                            for (var i=0 ; i < q1a.length; i++) {  
                            q1a[i] ='<c:set sequence="grp"><c:out key="group.PrName" data=' + QA + i + '"><dom:body key="group.PrValue" />';  
                            }
                            

                            so läuft es.

                            Keine Ahnung, warum so was passiert.

                            Weil der Code seltsam ist. Ein Array fängt immer bei Null an und die Schleife geht bis zum letzten Index nicht bis eins darüber hinaus.

                            Struppi.

                            1. Hi,

                              Weil der Code seltsam ist. Ein Array fängt immer bei Null an und die Schleife geht bis zum letzten Index nicht bis eins darüber hinaus.

                              Ich gib dir wiederum Recht. Das mit dem 0 ist mir natürlich schon bekannt (Das ist doch klar), aber da wollte ich die, dann erzeugte, Variable: q1a0 nicht benutzen bzw. werde ich sie nicht gebrauchen und
                              bin auf die Idee gekommen sie schon von anfang an mit der: i=0;
                              los zu werden.

                              [...]Schleife geht bis zum letzten Index nicht bis eins darüber hinaus.

                              Das war ein Tipp-Fehler bzw. Denkfehler.

                              Eigentlich, hätte ich auf diesen Fehler kommen müssen.

                              Aber ich check es Mal und versche es in die JSTL-Biblithek einzubinden und hoffe, dass ich damit Erfolg bekomme.

                              Vielen Dank und Gruß
                              Messmar

                            2. Hi,

                              var QA = '"xyzQ1A';

                              for (var i=0 ; i < q1a.length; i++) {
                              q1a[i] ='<c:set sequence="grp"><c:out key="group.PrName" data=' + QA + i + '"><dom:body key="group.PrValue" />';
                              }

                              
                              > so läuft es.  
                                
                              Fehler: 'q1a1'ist undefiniert.  
                              Hatte ich auch schon ;-(  
                                
                              ~~~javascript
                                
                                
                              var q1a = new Array(10);  
                              var QA = '"xyzQ1A';  
                                
                              for (var i=0 ; i < q1a.length; i++) {  
                               q1a[i] ='<c:set sequence="grp"><c:out key="group.PrName" data=' + QA + i + '"><dom:body key="group.PrValue" />';  
                              }  
                                
                              alert("Erste Frage und Antwort: \n" + q1a1);  
                              alert("Neunte Frage und Antwort: \n" + q1a9);  
                              
                              
                              1. Yerf!

                                alert("Erste Frage und Antwort: \n" + q1a1);
                                alert("Neunte Frage und Antwort: \n" + q1a9);

                                  
                                ~~~javascript
                                  
                                alert("Erste Frage und Antwort: \n" + q1a[1]);  
                                alert("Neunte Frage und Antwort: \n" + q1a[9]);  
                                
                                

                                Du musst die Verwendung des Arrays schon überall einheitlich durchziehen. Der Vorteil liegt aber klar auf der Hand: man kann jederzeit entweder einen festen Index oder eine Variable beuntzen, ohne seltsame Verrenkungen mit eval() oder ähnlichem machen zu müssen. Oder anders ausgedrückt: genau dafür wurden Arrays erfunden.

                                Gruß,

                                Harlequin

                                --
                                <!--[if IE]>This page is best viewed with a webbrowser. Get one today!<![endif]-->
                              2. Hi,

                                var QA = '"xyzQ1A';

                                for (var i=0 ; i < q1a.length; i++) {
                                q1a[i] ='<c:set sequence="grp"><c:out key="group.PrName" data=' + QA + i + '"><dom:body key="group.PrValue" />';
                                }

                                
                                > > so läuft es.  
                                >   
                                > Fehler: 'q1a1'ist undefiniert.  
                                  
                                Wo wird in dem code q1a1 verwendet????  
                                  
                                
                                > alert("Erste Frage und Antwort: \n" + q1a1);  
                                > alert("Neunte Frage und Antwort: \n" + q1a9);  
                                  
                                dir scheint die Verwendung von Arrays nicht geläufig zu sein.  
                                  
                                ~~~javascript
                                alert("Erste Frage und Antwort: \n" + q1a[0]);  
                                alert("Neunte Frage und Antwort: \n" + q1a[8]);  
                                
                                

                                Struppi.

                                1. Hi,

                                  dir scheint die Verwendung von Arrays nicht geläufig zu sein.

                                  Oh doch ;-) aber manchmal steige ich aus, wenn zu kompliziert wird ;-)

                                  Ich rufe dann die Variablen an anderer Stelle folgendermaßen auf. Die müssen aber schon existieren:

                                  zB.

                                  answers[0][0] = q1a1;
                                  answers[0][1] = q1a2;
                                  answers[0][2] = q1a3;
                                  answers[0][3] = q1a4;

                                  uzw.

                                  Ich schau mal. Höchstwahrscheinlich, muss ich dann den Rest des Code ändern. also:

                                  answers[0][0] = q1a[1];
                                  answers[0][1] = q1a[2];
                                  answers[0][2] = q1a[3];
                                  answers[0][3] = q1a[4];

                                  Danke und Gruß
                                  Messmar

                                  1. Ich schau mal. Höchstwahrscheinlich, muss ich dann den Rest des Code ändern. also:

                                    answers[0][0] = q1a[1];
                                    answers[0][1] = q1a[2];
                                    answers[0][2] = q1a[3];
                                    answers[0][3] = q1a[4];

                                    Warum willst du die Werte unbedingt doppelt im Speicher haben?
                                    Warum versteifst du dich so auf die eins als Start?

                                    Struppi.