Stephan: Variablen je nach Text auswählen

Hallo zusammen!

Ich habe folgendes Problemchen:

Ich habe eine ganze Reihe von Arrays:

arr_1 = new Array("inhalte");
arr_2 = new Array("inhalte");
arr_3 = new Array("inhalte");
...

Nun möchte ich je nachdem welches Element ich im eigentlichem Dokument angeklickt habe die Arrays danach auswählen.
Klicke ich z.B. auf "Element 1", dann übermittle ich eine 1 und es  soll Arr_1 verarbeitet werden.

temp_arr = arr_"1"             funktioniert z.B. nicht

Eine Select Case Abfrage kommt nicht in Frage, da es sich um zuviele Arrays handelt und ich mehrere Dateien haben werde mit unterschiedlich vielen Arrays etc.

Ich hoffe es gibt es eine Möglichkeit wie man leicht und elegant das zu verarbeitende Array auswählen kann.

mfg Stephan

  1. Hello,

    Ich hoffe es gibt es eine Möglichkeit wie man leicht und elegant das zu verarbeitende Array auswählen kann.

    leicht: ja
    elegant: eher nein
    eval könnte helfen.

    MfG
    Rouven

    --
    -------------------
    There's no such thing as a free lunch  --  Milton Friedman
    1. Hello out there!

      eval könnte helfen.

      Aua, „eval() is evil().“ (Cheatah) [ZITAT910]

      Und in den allermeisten Fällen durchaus zu vermeiden. Dieser Fall ist ein solcher.

      See ya up the road,
      Gunnar

      --
      „Wer Gründe anhört, kommt in Gefahr nachzugeben.“ (Goethe)
      1. Hello,

        Aua, „eval() is evil().“ (Cheatah) [ZITAT910]
        Und in den allermeisten Fällen durchaus zu vermeiden. Dieser Fall ist ein solcher.

        dem stimme ich 100% zu - deswegen schrieb ich auch "leicht: ja; elegant: eher nein" - ändert nichts daran, dass es sich dabei um eine mögliche Lösung handelt.

        MfG
        Rouven

        --
        -------------------
        There's no such thing as a free lunch  --  Milton Friedman
        1. dem stimme ich 100% zu - deswegen schrieb ich auch "leicht: ja; elegant: eher nein" - ändert nichts daran, dass es sich dabei um eine mögliche Lösung handelt.

          Was bitte ist an window[varname] unelegant?

          Siechfred

          --
          Ein Selbständiger ist jemand, der bereit ist, 16 Stunden am Tag zu arbeiten, nur um nicht 8 Stunden für einen Anderen arbeiten zu müssen.
  2. Hello out there!

    Ich habe eine ganze Reihe von Arrays:
    arr_1 = new Array("inhalte");
    arr_2 = new Array("inhalte");
    arr_3 = new Array("inhalte");

    Schlecht.

    Ich hoffe es gibt es eine Möglichkeit wie man leicht und elegant das zu verarbeitende Array auswählen kann.

    Ja ein Array (von Arrays): Also nicht arr_1, arr_2, arr_3 usw.; sondern arr[0], arr[1], arr[2], ...

    var arr = new Array();  
    arr[0] = new Array("inhalte");  
    arr[1] = new Array("inhalte");  
    arr[2] = new Array("inhalte");
    

    Auf die Inhalte greifst du dann mit arr[i][j] zu.

    See ya up the road,
    Gunnar

    --
    „Wer Gründe anhört, kommt in Gefahr nachzugeben.“ (Goethe)
  3. Hallo zusammen!

    Ich habe folgendes Problemchen:

    Ich habe eine ganze Reihe von Arrays:

    arr_1 = new Array("inhalte");
    arr_2 = new Array("inhalte");
    arr_3 = new Array("inhalte");
    ...

    Warum packst Du die Arrays nicht in ein übergeordnetes Array?

    arr[1] = new Array("inhalte");
    arr[2] = new Array("inhalte");
    arr[3] = new Array("inhalte");

    Dann kannst Du den Index durch eine Variable ersetzen.

  4. Hallo, ich bins nochmal.

    Danke schonmal. Ich glaube ich erläutere mein Problem noch ein bisschen näher.

    Es ist so, dass ich ein SVG mit ner Weltkarte habe und zu fast allen Ländern 2 Arrays:

    arr_int_fr = new Array("inhalte");
    arr_ext_fr = new Array("inhalte");
    arr_int_de = new Array("inhalte");
    arr_ext_de = new Array("inhalte");

    Wenn ich jetzt auf ein Land klicke (z.B. Deutschland), dann gebe ich per Parameter z.B. "de" an die Funktion. Diese soll dann das Array für Deutschland benutzen und damit etwas machen.

    mfg Stephan

    1. Hallo, ich bins nochmal.

      Danke schonmal. Ich glaube ich erläutere mein Problem noch ein bisschen näher.

      Es ist so, dass ich ein SVG mit ner Weltkarte habe und zu fast allen Ländern 2 Arrays:

      arr_int_fr = new Array("inhalte");
      arr_ext_fr = new Array("inhalte");
      arr_int_de = new Array("inhalte");
      arr_ext_de = new Array("inhalte");

      Was spricht gegen

      arr_int['fr']
      arr_ext['de']

  5. Klicke ich z.B. auf "Element 1", dann übermittle ich eine 1 und es  soll Arr_1 verarbeitet werden.
    temp_arr = arr_"1"             funktioniert z.B. nicht

    Dann sprich es im richtigen Kontext an und vermeide Redundanz:

    var zaehler = 2;  
    var temp_arr = 'arr_' + zaehler;
    

    Über window[temp_arr] greifst du auf das Array zu, das du manipulieren willst. Beispiel:

    function addElementToArray ( array_nr, content ) {  
      var temp_arr = 'arr_' + array_nr;  
      window[temp_arr].push(content);  
    }
    

    Viel Erfolg.

    Siechfred

    --
    Ein Selbständiger ist jemand, der bereit ist, 16 Stunden am Tag zu arbeiten, nur um nicht 8 Stunden für einen Anderen arbeiten zu müssen.
  6. gruss Stephan

    ...
    Ich habe eine ganze Reihe von Arrays:

    arr_1 = new Array("inhalte");
    arr_2 = new Array("inhalte");
    arr_3 = new Array("inhalte");
    ...

    Nun möchte ich je nachdem welches Element ich im eigentlichem
    Dokument angeklickt habe die Arrays danach auswählen.
    Klicke ich z.B. auf "Element 1", dann übermittle ich eine 1
    und es  soll Arr_1 verarbeitet werden.
    ...

    dafuer bieten sich gleich mehrere, verschieden elegante,
    loesungen an.

    erstens)

    Deine hoechstwahrscheinlich global (also im [window]-scope)
    initialisierten arrays werden nicht ueber ihren namen referenziert,
    sondern ueber den jeweiligen index eines arrays dessen member sie
    sind (konzept: "array of arrays").

    var contentList = new Array(); // oder auch: var contentList = [];  
      
    contentList[0] = new Array("inhalte01"); // contentList[0] = ["inhalte01"];  
    contentList[1] = new Array("inhalte02"); // contentList[1] = ["inhalte02"];  
    contentList[2] = new Array("inhalte03"); // contentList[2] = ["inhalte03"];
    

    oder auch:

    contentList.push(new Array("inhalte01")) // contentList.push(["inhalte01"]);  
    contentList.push(new Array("inhalte02")) // contentList.push(["inhalte02"]);  
    contentList.push(new Array("inhalte03")) // contentList.push(["inhalte03"]);
    

    in der literalnotation saehe eine initialisierung auf einen ritt
    so aus:

    var contentList = [  
     ["inhalte01"/*, ..., ..., "damit es"*/],  
     ["inhalte02"/*, ..., ..., "ein bischen"*/],  
     ["inhalte03"/*, ..., ..., "voller wird"*/]  
    ];
    

    wie von Dir gewuenscht, enthaelt die auf klick aufgerufene funktion
    in ihrem funktionsargument den index des zu bearbeitenden (sub)arrays;
    falls Du nicht bei »0«, sondern mit »1« zu zaehlen beginnst musst Du
    diese verschiebung beruecksichtigen.

    zweitens)

    Du behaelst das von Dir im bsp. vorgegebene namensschema bei -

    temp_arr = arr_"1"             funktioniert z.B. nicht

    richtig - das erreichst Du bei einem von mir angenommenen globalen
    scope ueber:

    var arr = window["arr_" + idx];

    wobei »idx« das von Dir zu uebermittelnde funktionsargument darstellt.

    drittens)

    Du behaelst das von Dir im bsp. vorgegebene namensschema bei und
    uebermittelst nicht den zahlenwert, sondern gleich die (objekt-)
    referenz auf das von Dir bzw. dem programm zur bearbeitung
    vorgesehene array - wahrscheinlich arbeitest Du mit einem onclick-
    handler als inline-code ...

    ... aus:

    <elm onclick="tuDiesemArrayIrgendwasAn(1)" />

    ... wuerde dann:

    <elm onclick="tuDiesemArrayIrgendwasAn(arr_1)" />

    so long - peterS. - pseliger@gmx.net

    --
    »Because objects in JavaScript are so flexible, you will want to think differently about class hierarchies.
    Deep hierarchies are inappropriate. Shallow hierarchies are efficient and expressive.« - Douglas Crockford
    ie:( fl:) br:> va:( ls:& fo:) rl:| n3;} n4:} ss:} de:µ js:} mo:? zu:]
  7. Hallo,

    Nun möchte ich je nachdem welches Element ich im eigentlichem Dokument angeklickt habe die Arrays danach auswählen.

    Meine Variante wäre ein einfaches Objekt, da diese in JavaScript fast gleich der Datenstruktur Hash/Dictionary sind:

    ~~~javascript var states = {
        "en" : new Array("englische Inhalte"),
        "de" : new Array("deutsche Inhalte"),
        "es" : new Array("spanische Inhalte")
      };

      
    Zugriff dann einfach mittels `states.en`{:.language-javascript} oder `states["en"]`{:.language-javascript}. Das ist im wesentlichen diesselbe Variante wie [Siechfreds](https://forum.selfhtml.org/?t=157658&m=1025768), nur dass hier nicht das globale Objekt window das Host-Objekt ist sondern ein definiertes Objekt.  
      
    Du schriebst, dass Du pro Land zwei Arrays hast. Dasselbe Prinzip, nur einen Hauch verschachtelter:  
      
      ~~~javascript
    var states = {  
        "en" : {  
          "int" : ["englisches", "externes", "Array"],  
          "ext" : ["englisches", "internes", "Array"]  
        },  
        "de" : {  
          "int" : [ ... ],  
          "ext" : [ ... ]  
        }  
      };
    

    Zugriff dann über states.["en"].int oder states["en"]["int"]. Einfach, weil man auf Objekte auch in Array-Zugriffs-Notation zugreifen kann und somit Variablen zur Adressierung nutzen kann. Das Schema kannst Du auch zum dynamischen Aufbauen der Baumstruktur nutzen, wenn Du das Ganze über mehre Dateien verteilst:

    states[langtag].int = new Array("blablabla");

    Vorrausgesetzt, das ganze ist sequenziell notiert und die Variable states ist als Objekt initialisiert kannst Du somit das Aufbauen der Datenstruktur dynamisch erledigen lassen.

    ...

    Ein Idee noch zum Zugriff: Im Web stolpert man immer wieder über definierte Language tags, die nicht nur "de" sind, sondern auch "de-DE" oder gar "de-DE-1910-x-tim". Jeder weitere Sub-Tag (getrennt durch "-") wird nach rechts gelesen immer spezifischer. Solltest Du mit Language tags mit Sub-Tags rechnen müssen und spezielle Arrays dafür haben, wäre es vielleicht eine gute Idee, erst nach den Arrays spezifischerer Language tags zu suchen und bei Nichtfinden dann nach etwas weniger spezifischeren Language tags zu suchen. Das könntest Du dann in einer Funktion kapseln, ungefähr so, wie in diesem nur halbwegs getestetem Code:

    ~~~javascript function language (tag) {

    /* Die Arrays hier mal in der Funktion versteckt */
        var states = { "de" : ["...", "..."] };

    /* Liefert für einen Tag "de-De" den weniger spezifischen Tag "de" zurück /
        function reduce_tag (tag) {
          var smaller = tag.slice(0, tag.lastIndexOf("-"));
          /
    Sonderbehandlung für den private use subtag */
          if (smaller.substr(smaller.lastIndexOf("-") + 1) == "x") {
            return reduce_tag(smaller);
          };
          return smaller;
        };

    /* Wenn vorhanden, sind wir glücklich. */
        if (states[tag]) {
          return states[tag];
        };

    /* Ansonsten reduzieren wir bis zum ersten  */
        while (!states[tag] && tag != "") {
          tag = reduce_tag(tag);
        };

    /* Egal, was rauskommt, irgendwann muss ein Ergebnis oder undefined
           zurück gegeben werden. */
        return states[tag];
      };

      
    (Verbesserungsfähig, natürlich)  
      
      
    Tim