Variablen je nach Text auswählen
Stephan
- javascript
Hallo zusammen!
Ich habe folgendes Problemchen:
Ich habe eine ganze Reihe von Arrays:
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
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
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
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
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
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.
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
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']
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
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
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