eval()
WernerK
- javascript
1 dedlfix-1 pl0 Gunnar Bittersmann1 Orlok- javascript
- programmiertechnik
Hallo,
kurze Frage vor dem Wochenende 😀
Die unten stehende Funktion soll ein Array zurückgeben in Abhängigkeit der id die man übergibt. Ohne dem "eval()" funktioniert das nicht, da der zusammengebaute String nicht als Array interpretiert wird. Ich habe gelesen, dass man eval() möglichst nicht verwenden soll.
Gibt es eine andere Möglichkeit?
myElements: function(id){
arrElements0 = [1, 3, 4, 5, 7];
arrElements1 = [0, 2, 3, 4, 5, 6, 7];
return eval("arrElements" + id);
}
Gruss
Werner
Tach!
Ich habe gelesen, dass man eval() möglichst nicht verwenden soll.
Vor allem, weil das eval() ungesehen alles ausführt, was man ihm vorsetzt. Besonders kritisch ist das bei Nutzereingaben, bei denen man sich nicht vergewissert hat, dass damit nichts ungewolltes passiert.
Die unten stehende Funktion soll ein Array zurückgeben in Abhängigkeit der id die man übergibt. Ohne dem "eval()" funktioniert das nicht, da der zusammengebaute String nicht als Array interpretiert wird.
Gibt es eine andere Möglichkeit?
Statt zweier Variablen könntest du eine nehmen, die aber ein Array ist oder ein Objekt.
myElements: function(id){
arrElements = new Array();
arrElements[0] = [1, 3, 4, 5, 7];
arrElements[1] = [0, 2, 3, 4, 5, 6, 7];
return arrElements[id];
}
Oder
myElements: function(id){
arrElements = {
'0': [1, 3, 4, 5, 7],
'1': [0, 2, 3, 4, 5, 6, 7]
};
return arrElements[id];
}
dedlfix.
@@dedlfix
myElements: function(id){ arrElements = new Array(); arrElements[0] = [1, 3, 4, 5, 7]; arrElements[1] = [0, 2, 3, 4, 5, 6, 7]; return arrElements[id]; }
Einfacher geschrieben:
myElements: function(id){
arrElements = [
[1, 3, 4, 5, 7],
[0, 2, 3, 4, 5, 6, 7]
];
return arrElements[id];
}
Wobei das eben Gesagte noch zu berichtigen ist:
myElements: function(id){
var arrElements = [
[1, 3, 4, 5, 7],
[0, 2, 3, 4, 5, 6, 7]
];
return arrElements[id];
}
bzw.
myElements: function(id){
const arrElements = [
[1, 3, 4, 5, 7],
[0, 2, 3, 4, 5, 6, 7]
];
return arrElements[id];
}
LLAP 🖖
@@dedlfix
myElements: function(id){ arrElements = …
Globale Variablen sind wohl keine gute Idee. Das sollte
myElements: function(id){
var arrElements = …
heißen. In modernen Brosern
myElements: function(id){
const arrElements = …
LLAP 🖖
Hallo,
danke für die Tipps.
Diese Schreibweise finde ich ganz gut.
myElements: function(id){
var arrElements = new Array();
arrElements[0] = [1, 3, 4, 5, 7];
arrElements[1] = [0, 2, 3, 4, 5, 6, 7];
return arrElements[id];
}
Hat man dann eigentlich ein "mehrdimensionales" Array erstellt? Weil [1, 3, 4, 5, 7] ist ja schon ein Array und dies wird dann ja wiederum nochmals einem Array zugewiesen.
Gruss Werner
@@WernerK
Hat man dann eigentlich ein "mehrdimensionales" Array erstellt?
Ja. Genau das wird in der gezeigten kürzeren Schreibweise auch deutlich(er).
LLAP 🖖
Tach!
Hat man dann eigentlich ein "mehrdimensionales" Array erstellt? Weil [1, 3, 4, 5, 7] ist ja schon ein Array und dies wird dann ja wiederum nochmals einem Array zugewiesen.
Man wird dich verstehen, aber ich bevorzuge den Begriff "verschachtelte Arrays" (oder Einzahl). In diesem Beispiel hast du 3 Arrays, zwei innere und ein äußeres. Die inneren können beliebig groß sein, und sind es auch in dem Fall. Mehrdimensional sind für mich Daten, die man in einem Koordinatensystem darstellen kann, deren Achsen gleichmäßig in ihre jeweilige Richtung gehen, und wenn es Werte für alle x, y(, z, ...) gibt.
dedlfix.
Hallo WernerK,
was Dedlfix schreibt, ist keine reine Begriffeklauberei. Verschachtelte Arrays und mehrdimensionale Arrays sind unterschiedliche Dinge.
Ein mehrdimensionales Array ist EIN Objekt. Seine Form ist regelmäßig, z.B. bei einem zweidimensionalen Array hat die 1. Zeile genauso viele Spalten wie die 2. Zeile. Die Anzahl der Dimensionen ist von vorn herein festgelegt und nachträglich nicht mehr änderbar. Mehrdimensionale Arrays sind sinnvoll, wenn tatsächlich mehrdimensionale Daten vorliegen (Beispiel zweidimensional: Figuren auf einem Schachbrett). In JavaScript oder PHP gibt es keine mehrdimensionalen Arrays. In Sprachen wie C# oder Java schon.
Ein verschachteltes Array besteht aus mehreren Objekten. Auf der obersten Ebene befindet sich ein eindimensionales Array, dessen Elemente wiederum eindimensionale Arrays sind. Jedes dieser innerern Arrays hat eine variable Anzahl von Elementen, jedes Array auf der zweiten Ebene kann einfache Werte enthalten oder irgendwelche Objekte. Unter anderem auch weitere Arrays - die Schachtelungstiefe ist nicht begrenzt und muss auch im Voraus nicht festgelegt werden. Verschachtelte Arrays werden nur von Sprachen unterstützt, die mit Objektreferenzen umgehen können und explizit Objekte vom Typ Array kennen.
Mehrdimensionale Arrays können von Compilersprachen effizienter in Maschinencode übersetzt werden. Verschachtelte Arrays sind langsamer, aber eben auch flexibler und ggf. speichersparender, wenn inneren Arrays sehr unterschiedliche Längen haben.
Rolf
Hallo Rolf,
ich mache die Dimension eines Arrays daran fest, wieviele Parameter bzw. Indizes ich zum Adressieren eines Elements benötige: a[i][j][k]
ist dann ein 3D-Array. Ob es Subarrays gibt und ob dieses alle gleichviele Elemente haben, spielt da dann keine Rolle und ist nur von der jeweiligen Sprache abhängig.
In C geht beides, also Array von Array von Array ... mit beliebig großen Subarrays oder double a[L][M][N];
mit gleich großen Subarrays. Javascript kennt nur Array von Array mit beliebig großen Subarrays und LabVIEW kennt Array von Array mit gleich großen Subarrays.
Gruß
Jürgen
Hi,
Datenstrukturen sind nicht schlechthin mehrdimensional oder geschachtelt sondern haben eine der Zweckbestimmung entsprechende Struktur. Hier mal ein Beispiel:
var address = {
Hugo => {
plz => '12345',
name => 'Hugo',
hobbies => ['reiten','radfahren']
},
Elmar = {} usw
};
Abstrakte Datentypen sind also mehr als nur Arrays. Sie sind eine Sammlung von Daten die einen zweckbestimmten Zusammenhalt haben wie z.B. Personen, Adressen, Hausnummern usw. und definieren Methoden für den wahlfreien Zugriff. Gegenüber Array[] haben Objekte{} den Vorteil der namentlichen Addressierung (beim Array hast man nur den Index).
MfG
@@pl
Hier mal ein Beispiel:
var address = { Hugo => { plz => '12345', name => 'Hugo', hobbies => ['reiten','radfahren'] }, Elmar = {} usw };
Ein schlechtes. Was haben denn Hobbys mit einer Adresse zu tun?
Bei Elmar sollte wohl auch =>
stehen. Nur: welche Sprache soll das sein? Du hast den Code mit js
gekennzeichnet, aber JavaScript ist es nicht.
LLAP 🖖
PS: Das Rätsel klingt wie: „Die Wangen sind mit Asche beschmutzt, aber der Schornsteinfeger ist es nicht …“ Hach, bald isses wieder soweit.
Bei Elmar sollte wohl auch
=>
stehen. Nur: welche Sprache soll das sein? Du hast den Code mitjs
gekennzeichnet, aber JavaScript ist es nicht.
Ach was glaubst Du warum das abstrakter Datentyp heißt 😉
@@pl
Nur: welche Sprache soll das sein? Du hast den Code mit
js
gekennzeichnet, aber JavaScript ist es nicht.Ach was glaubst Du warum das abstrakter Datentyp heißt 😉
Ach, was glaubst du, warum man bei `Pseudocode`
keine Sprache angeben muss? 😜
LLAP 🖖
PS: Ach ja, da ist ein Bug im UI. Muss ich wohl mal ein Ticket erstellen? @Christian Kruse
Bei Elmar sollte wohl auch
=>
stehen. Nur: welche Sprache soll das sein? Du hast den Code mitjs
gekennzeichnet, aber JavaScript ist es nicht.Ach was glaubst Du warum das abstrakter Datentyp heißt 😉
Das was du zeigst, ist aber auch kein abstrakter Datentyp. Das ist nur ein Wert. Im Namen Datentyp steckt ja schon das Wörtchen Typ und nicht Wert drin. Die meisten Programmiersprachen unterscheiden zwischen Wert-Ausdrücken und Typ-Ausdrücken. JavaScript hat letzteres nicht, deshalb ist es schwierig bei JavaScript überhaupt von Datentypen zu sprechen. TypeScript ergänz JavaScript um diese Typ-Ausdrücke und daran lässt sich dann auch der Unterschied zwischen konkreten und abstrakten Datentypen erklären. Die folgenden Beispiele definieren jeweils konkrete Datentypen StringList und NumberList:
interface StringList {
empty: StringList;
prepend : (head: String, tail: StringList) => StringList;
}
interface NumberList {
empty: NumberList;
prepend : (head: Number, tail: NumberList) => NumberList;
}
Das Problem hier ist, dass sich die Implemtierungen von StringList
und NumberList
wahrscheinlich überhaupt nicht voneinander unterscheiden. Ein abstrakter Datentyp nutzt das aus und bietet die Möglichkeit eine Implementierung für beides anzugeben: Für Listen mit Zeichenketten, für Listen mit Zahlen und ganz allgemein für Listen mit beliebigen Inhaltstypen. In TypeScript sähe die entsprechende Typdefinition dafür so aus:
interface List<a> {
empty: List<a>;
prepend : (head: a, tail: List<a>) => List<a>;
}
Der Typparameter a
steht hier stellvertrend für den Datentypen, den die Liste kapselt.
Ein besserer Ausdruck für abstrakter Datentyp ist übrigens polymorpher Datentyp und für konkrete Datentypen monomorpher Datentyp.
Du dagegen hast den Unterschied zwischen Arrays und Dictionaries erklärt, mit den Ausführungen hast du im Übrigen auch recht, nur ist der Bezug zu abstrakten Datentypen fehl am Platz.
Bei Elmar sollte wohl auch
=>
stehen. Nur: welche Sprache soll das sein? Du hast den Code mitjs
gekennzeichnet, aber JavaScript ist es nicht.Ach was glaubst Du warum das abstrakter Datentyp heißt 😉
Das was du zeigst, ist aber auch kein abstrakter Datentyp.
lt. Wikipedia:
Ein Abstrakter Datentyp (ADT) ist ein Verbund von Daten zusammen mit der Definition aller zulässigen Operationen, die auf sie zugreifen.
Ich persönlich finde jedoch, der Begriff Datenstruktur trifft es besser.
MfG
Hallo pl,
laut Wikipedia ist der Übergang zwischen Datenstruktur und ADT fließend. Wer von ADT spricht, sagt die Wikipedia, legt den Schwerpunkt auf die konkrete Implementierung.
Find ich merkwürdig, dass die konkrete Implementierung vom abstrakten Datentyp betrachtet wird 😀
Wenn ich so in meinen Bücherschrank schaue und den schwer vergilbten FU Hagen Kurs "Algorithmen und Datenstrukturen" hervorlugen sehe, neben Sedgewicks "Algorithmen", dann kümmert man sich bei "Datenstrukturen" vor allem um die Zusammenhänge zwischen den Objekten eines ADT, die von der Implementierung verarbeitet werden.
Wie auch immer. Dein Objektliteral da oben war also eine Datenstruktur, aber kein ADT 😀
Pax & Amicitia 😉 Rolf
..wobei die Datenstrukturen völlig unspektakulär sind. Interessanter sind die Algorithmen wenn es um den Transport geht und da ich schon einige solche entwickelt habe, stelle ich hier mal eine schöne Bahauptung in den Raum:
Es ist möglich, jede beliebige und jede beliebig tief geschachtelte Datenstruktur zu linearisieren und in ein normales Array zu transformieren ohne daß Informationen verlorengehen und aus dem Array die orginal Datenstruktur wiederherzustellen.
Also bspw. die Daten dieses Forums oder HTML/XML Dokumente.
Schönen Tag 😉
Es ist möglich, jede beliebige und jede beliebig tief geschachtelte Datenstruktur zu linearisieren und in ein normales Array zu transformieren ohne daß Informationen verlorengehen und aus dem Array die orginal Datenstruktur wiederherzustellen.
Challenge accepted. Mach das mal für eine überabzählbare Menge.
Hallo 1unitedpower,
du legst vor. Speichere eine überabzählbare Menge in einem Computer.
Vorübung: Versuche es mit einer abzählbar unendlichen Menge. Genügend RAM-Riegel und Festplatten gibt's im Shop von Hilberts Hotel.
Wenn Du fertig bist, treffen wir uns auf unendlich viele Biere in Hilberts Bar. Ich nehme sicherheitshalber den Bus!
Rolf
Hallo,
Hilberts Hotel ... und Hilberts Bar. Ich nehme sicherheitshalber den Bus!
Wenn nun aber alle Zimmer im Hotel belegt sind, wie voll ist dann die Bar?
Zusatzfrage: Wieviele Busparkplätze besitzt das Hotel?
Gruß
Kalk
Hallo Tabellenkalk,
ist überhaupt kein Problem. Die Bar ist natürlich genauso voll wie das Hotel, aber wenn 1UP und ich kommen, rückt jeder Gast zwei Plätze nach hinten und wir können uns setzen.
Glücklicherweise gibt's genug Zapfhähne: nach jeweils 10 Tischen kommt eine kleine Bar. Schön entspannt. Lästig sind nur die Echos von den unendlich vielen Lautsprechern, die die Hits von Helene Fischer unendlich oft spielen.
Die Busparkplätze interessieren mich nicht, ich nehme den Bus der Linie $$\infty$$, der vor dem Hotel hält. Da die meisten Gäste mit ihren unendlich vielen Reisebussen da sind, ist an der Bushaltestelle nicht viel los. Nur unendlich viele Leute, die da warten...
Rolf
du legst vor. Speichere eine überabzählbare Menge in einem Computer.
Macht jede echte Turing-Maschine im Schlaf ;-) und hier ist deine überabzählbare Menge (du hast nicht gesagt, dass man alle Elemente der Menge speichern soll): $${\rm I!R}$$ ist ein total geordneter, ordnungsvollständiger Körper.
Hallo redirect,
wenn du "eine Menge" speichern sollst, dann wohl alle Elemente. Andernfalls wäre es nur eine Teilmenge.
Aber wenn's Dir hilft: speichere die Teilmenge $$]1,2[ \subset \mathbb R$$. Um Speicher zu ersparen, habe ich die Ränder weggelassen!
Rolf
@@Rolf B
Aber wenn's Dir hilft: speichere die Teilmenge $$]1,2[ \subset \mathbb R$$. Um Speicher zu ersparen, habe ich die Ränder weggelassen!
Protip: Um Speicher zu sparen, kannst du auch den Vorkomma-Anteil weglassen.
LLAP 🖖
wenn du "eine Menge" speichern sollst, dann wohl alle Elemente. Andernfalls wäre es nur eine Teilmenge.
Zwei Mengen sind gleich, wenn je alle Elemente der einen Menge in der anderen Menge enthalten sind; meine beschriebene Menge ist also die selbe Menge wie die gewollte (aber nicht geforderte) Aufzählung ihrer Elemente.
Aber wenn's Dir hilft: speichere die Teilmenge $$]1,2[ \subset \mathbb R$$. Um Speicher zu ersparen, habe ich die Ränder weggelassen!
Da bin ich dir aber unendlich (mit Kardinalität $$\aleph_1 < \beth_1$$) dankbar ;-)
du legst vor. Speichere eine überabzählbare Menge in einem Computer.
Macht jede echte Turing-Maschine im Schlaf 😉
Leider nicht mal das. Nicht mal wenn du der Turing-Maschine unendlich viel Laufzeit spendierst und du nur den Grenzwert der Berechnung betrachtest stehen am Ende™ alle Elemente auf dem Band. Überabzähbare Mengen sind nicht rekursiv aufzählbar.
Leider nicht mal das. Nicht mal wenn du der Turing-Maschine unendlich viel Laufzeit spendierst
Ist es egal wie groß das unendlich ist? Zeit haben wir vielleicht überabzählbar viel (aber das ist dann eher eine Zeno- als eine Turing-Maschine).
und du nur den Grenzwert der Berechnung betrachtest stehen am Ende™ alle Elemente auf dem Band. Überabzähbare Mengen sind nicht rekursiv aufzählbar.
Mea culpa, da hast du natürlich recht, dann brauchen wir etwas besseres (wir könnten bei Oracle nachfragen oder einen echten Computer bauen) oder mehr Turingmaschinen (abzählbar viele reichen auch nicht, oder?)
@@redirect
oder mehr Turingmaschinen (abzählbar viele reichen auch nicht, oder?)
Abzählbar viele Turingmaschinen können genausoviel wie eine Turingmaschine. Nur etwas schneller. <Q>Aber was sind schon ein oder zwei Äonen?</Q>
LLAP 🖖
@@redirect
oder mehr Turingmaschinen (abzählbar viele reichen auch nicht, oder?)
Abzählbar viele Turingmaschinen können genausoviel wie eine Turingmaschine. Nur etwas schneller. <Q>Aber was sind schon ein oder zwei Äonen?</Q>
Ich glaube das auch ich schrieb's nur, weil ich nicht weiß, wie ich's beweisen soll.
Es ist möglich, jede beliebige und jede beliebig tief geschachtelte Datenstruktur zu linearisieren und in ein normales Array zu transformieren ohne daß Informationen verlorengehen und aus dem Array die orginal Datenstruktur wiederherzustellen.
Challenge accepted. Mach das mal für eine überabzählbare Menge.
Hast Du schonmal solche Algorithmen etwickelt? Schließlich gehts hier nicht um theoretische Mathematik sondern um praktische Fragen. Z.B. wie man ein JS-Objekt ({Schlüssel:Wert}) in ein Array (aufeinanderfolgende Werte) transformiert. MfG
Es ist möglich, jede beliebige und jede beliebig tief geschachtelte Datenstruktur zu linearisieren und in ein normales Array zu transformieren ohne daß Informationen verlorengehen und aus dem Array die orginal Datenstruktur wiederherzustellen.
Challenge accepted. Mach das mal für eine überabzählbare Menge.
Hast Du schonmal solche Algorithmen etwickelt?
Ich will nicht zu weit ausholen, aber Mathematica kann mit überabzählbaren Mengen umgehen. Das funktioniert, weil die Programmiersprache mit symbolischer Interpretation anstelle von Fließkomma-Arithmetik rechnet. Aus dem selben Grund können übrigens Menschen mit reellen Zahlen rechnen.
In der Webentwicklung hat man aber, da geb ich dir recht, mit überabzählbaren Mengen nichts am Hut. Sehr wohl hat man aber häufig mit abzählbar unendlichen Mengen zu tun, zum Beispiel wenn endliche Datenstrukturen nicht ausreichen, weil sie entweder zu groß sind, um auf einmal in den Speicher geladen zu werden, oder wenn ein Datenstrom in Echtzeit verarbeitet werden soll. Das ist also durchaus praxisrelevant.
hi,
In der Webentwicklung hat man aber, da geb ich dir recht, mit überabzählbaren Mengen nichts am Hut. Sehr wohl hat man aber häufig mit abzählbar unendlichen Mengen zu tun, zum Beispiel wenn endliche Datenstrukturen nicht ausreichen, weil sie entweder zu groß sind, um auf einmal in den Speicher geladen zu werden, oder wenn ein Datenstrom in Echtzeit verarbeitet werden soll. Das ist also durchaus praxisrelevant.
Stimmt. Genau deswegen wird eine nichtlinear geschachtelte Struktur zunächst linearisiert bevor sie serialisiert wird. Damit wird die Stream-Sequenz zyklisch, hat also Frames, Tupel oder Records (Teilsequenzen) die sich zyklisch wiederholen -- was letztendlich ein Array auf Byte-Ebene abbildet. mp3 ist das bekannteste und hörbare Beispiel und auch meine Serializer erzeugen zyklische Sequenzen weil sie die gegebenen Datenstrukturen in Arrays umwandeln. Alle diese so erzeugten Sequenzen sind streamfähig, können also unmmittelbar beim Eintreffen des ersten Bytes sequentiell verarbeitet werden.
Ebenso sind Operationen wie Schneiden oder Anhängen weiter Sequenzen im Low Level (auf byte Ebene) möglich.
MfG
Hi,
Datenstrukturen sind nicht schlechthin mehrdimensional oder geschachtelt sondern haben eine der Zweckbestimmung entsprechende Struktur. Hier mal ein Beispiel:
var kunden = { 1: { str: 'Straße', ort: 'Stadt', plz: '12345', name: 'Hugo', hobbies: ['reiten','radfahren'] }, 2: {} //usw };
Abstrakte Datentypen sind also mehr als nur Arrays. Sie sind eine Sammlung von Daten die einen zweckbestimmten Zusammenhalt haben wie z.B. Personen, Adressen, Hausnummern, Kunden usw. und definieren Methoden für den wahlfreien Zugriff. Gegenüber Array[] haben Objekte{} den Vorteil der namentlichen Addressierung (beim Array hast man nur den Index).
Im Beispiel ist jeder Kunde einschließlich seiner Eigenschaften per Kundennummer adressierbar. Eine Funktion könnte also ein einzelnes Kundenobjekt zurückgeben.
MfG
Hallo,
kurze Frage vor dem Wochenende 😀
Die unten stehende Funktion soll ein Array zurückgeben in Abhängigkeit der id die man übergibt. Ohne dem "eval()" funktioniert das nicht, da der zusammengebaute String nicht als Array interpretiert wird. Ich habe gelesen, dass man eval() möglichst nicht verwenden soll.
Gibt es eine andere Möglichkeit?
Ja: Den String so zusammensetzen, daß er mit Mitteln der Stringverarbeitung (wozu auch JSON gehört) geparst werden kann. MfG
@@pl
Ja: Den String so zusammensetzen, daß er mit Mitteln der Stringverarbeitung
Stringverarbeitung? Wie bitte?
(wozu auch JSON gehört) geparst werden kann.
Ich bin ja großer Freund von JSON – als Datenaustauschformat. Darum geht’s hier aber wohl nicht.
LLAP 🖖
@@pl
Ja: Den String so zusammensetzen, daß er mit Mitteln der Stringverarbeitung
Stringverarbeitung? Wie bitte?
(wozu auch JSON gehört) geparst werden kann.
Ich bin ja großer Freund von JSON – als Datenaustauschformat. Darum geht’s hier aber wohl nicht.
Es ging darum, dass in einem String nicht das Array erkannt bzw. interpretiert wird. Und ja, auch JSON ist ein String.
MfG
Tach!
Es ging darum, dass in einem String nicht das Array erkannt wird. Und ja, auch JSON ist ein String.
Nein, darum ging es nicht, das war nur eine ungenaue Formulierung. Gemeint war, dass ohne das eval() ein String nicht als der Name einer Variable interpretiert werden kann.
Das eigentliche Problem jedoch ist, dass es mit Arrays und Objekten bessere Möglichkeiten der Strukturierung von Daten gibt, als sie in einem Bündel von gleichartigen Variablen anzulegen.
dedlfix.
Hi,
Das eigentliche Problem jedoch ist, dass es mit Arrays und Objekten bessere Möglichkeiten der Strukturierung von Daten gibt, als sie in einem Bündel von gleichartigen Variablen anzulegen.
Das mag schon sein aber was hat das mit eval() und String zu tun?
MfG
Tach!
Das eigentliche Problem jedoch ist, dass es mit Arrays und Objekten bessere Möglichkeiten der Strukturierung von Daten gibt, als sie in einem Bündel von gleichartigen Variablen anzulegen.
Das mag schon sein aber was hat das mit eval() und String zu tun?
Zur Lösung des eigentlichen Problems braucht man kein eval(), wenn man es "richtig" macht. Aber in seinem Versuch, einen Variablennamen in einem String zusammenzusetzen und dann auf diese Variable zuzugreifen, braucht es eval().
dedlfix.
@@dedlfix
Aber in seinem Versuch, einen Variablennamen in einem String zusammenzusetzen und dann auf diese Variable zuzugreifen, braucht es eval().
Nein. Und das zeigte ich bereits.
LLAP 🖖
Tach!
Aber in seinem Versuch, einen Variablennamen in einem String zusammenzusetzen und dann auf diese Variable zuzugreifen, braucht es eval().
Nein. Und das zeigte ich bereits.
Ja gut, weil er hier im Beispiel globalen Variablen verwendet hat, die Eigenschaften von window sind. Aber solche hatte er vermutlich auch nicht wissentlich zu verwenden vorgehabt, nehme ich mal an. Und ich nehme auch nicht an, dass pl sich auf diesen Umstand bezog.
dedlfix.
@@dedlfix
Und ich nehme auch nicht an, dass pl sich auf diesen Umstand bezog.
Annahmen, worauf sich pl bezog, sind mit äußerster Vorsicht zu genießen. Das sind oft eher Schüsse ins Blaue als Annahmen. 😏
LLAP 🖖
Hallo,
Die unten stehende Funktion soll ein Array zurückgeben in Abhängigkeit der id die man übergibt. Ohne dem "eval()" funktioniert das nicht, da der zusammengebaute String nicht als Array interpretiert wird. Ich habe gelesen, dass man eval() möglichst nicht verwenden soll.
Gibt es eine andere Möglichkeit?
Ja: Den String so zusammensetzen, daß er mit Mitteln der Stringverarbeitung (wozu auch JSON gehört) geparst werden kann. MfG
einfach kannst du wohl nicht mehr. Ein Array durch Stringverarbeitung erseztzen???
Gruß
Jürgen
Hallo,
Die unten stehende Funktion soll ein Array zurückgeben in Abhängigkeit der id die man übergibt. Ohne dem "eval()" funktioniert das nicht, da der zusammengebaute String nicht als Array interpretiert wird. Ich habe gelesen, dass man eval() möglichst nicht verwenden soll.
Gibt es eine andere Möglichkeit?
Ja: Den String so zusammensetzen, daß er mit Mitteln der Stringverarbeitung (wozu auch JSON gehört) geparst werden kann. MfG
einfach kannst du wohl nicht mehr. Ein Array durch Stringverarbeitung erseztzen???
Gruß
Jürgen
"da der zusammengebaute String nicht als Array interpretiert wird"
War das Problem. Darauf hab ich mich bezogen. MfG
@@WernerK
Gibt es eine andere Möglichkeit?
Globale Variablen (solche hast du ohne Schlüsselworte wie var
, let
oder const
) sind Eigenschaften des windows
-Objekts und lassen sich darüber ansprechen, bspw:
windows.arrElements0
windows['arrElements0']
Die zweite Variante ließe sich nutzen, um den variablen Variablennamen zusammenzusetzen:
myElements: function(id){
arrElements0 = [1, 3, 4, 5, 7];
arrElements1 = [0, 2, 3, 4, 5, 6, 7];
return window["arrElements" + id];
}
Und jetzt vergisst du das ganz schnell wieder. Globale Variablen sind bäh! 💩
Wann immer die Frage variable Variablen ist, ist die Antwort – wie schon gesagt –: Array (oder Objekt).
LLAP 🖖
Hallo Werner
myElements: function(id){ arrElements0 = [1, 3, 4, 5, 7]; arrElements1 = [0, 2, 3, 4, 5, 6, 7]; return eval("arrElements" + id); }
Das Wesentliche wurde hier im Thread ja schon geklärt. Insbesondere zu eval
.
Wenn du auf die Unterstützung älterer Browser verzichten kannst, gäbe es allerdings noch andere Möglichkeiten als die genannten, um Daten mit deinen Elementen zu verknüpfen.
Anstatt wenig aussagekräftige Zahlen als ID zu setzen, was leicht zu Namenskonflikten führen kann, könntest du bei der Verwendung einer Map direkt entsprechende Objektreferenzen als Schlüssel zu den Arrays verwenden.
const data = new Map;
// Get object reference
const element = document.querySelector('...');
// Create entry with reference as key
data.set(element, [1, 3, 4, 5, 7]);
// Read value with reference
const value = data.get(element);
Eine Map verwaltet eine interne Liste von Schlüssel-Wert-Paaren, wobei sowohl die Werte als auch die Schlüssel beliebige Datentypen sein können.
Anders als bei Arrays, deren Elemente über einen ganzzahligen Index angesprochen werden und anders als bei planen Objekten, deren Eigenschaftsnamen nur Strings und Symbole sein können, ist es bei Maps möglich, Objekte direkt als Schlüssel zu verwenden.
Das Hinzufügen und Lesen von Einträgen kann wie in dem Beispiel oben bewerkstelligt werden. Darüber hinaus gäbe es aber auch die Möglichkeit bei der Erzeugung der Map die Einträge in einem iterbaren Objekt wie einem Array zu übergeben, wenn das in deinem Anwendungsfall sinnvoll erschiene.
const data = new Map([
[elementOne, [0, 1, 2, 3, 4]],
[elementTwo, [5, 6, 7, 8, 9]]
]);
// Get stored list
const value = data.get(elementOne)
Mit den Methoden entries
, keys
und values
könntest du Iteratoren für die Einträge, Schlüssel oder Werte der Map erzeugen, was nützlich wäre, wenn du Bedarf daran hättest auf mehreren Einträgen zu operieren.
Statt eine Map zu verwenden könnte es aber auch sinnvoll sein auf eine WeakMap zu setzen. Diese Datenstruktur ist vergleichbar mit einer Map aber speziell für die Verwendung von Objektreferenzen als Schlüssel für die Einträge ausgelegt.
const data = new WeakMap;
// Get object reference
const element = document.querySelector('...');
// Create entry with weak reference as key
data.set(element, [1, 3, 4, 5, 7]);
// Read value with reference
const value = data.get(element);
Bei einer WeakMap werden die Referenzen auf die als Schlüssel verwendeten Objekte schwach gehalten. Das bedeutet, dass wenn keine anderen Referenzen auf ein Objekt mehr bestehen, etwa weil es aus dem DOM entfernt wurde und auch sonst nichts mehr auf das Objekt verweist, dann wird es gelöscht.
Das hat den Vorteil, dass der Speicher für nicht mehr benötigte Objekte freigegeben werden kann. Ein Nachteil besteht allerdings darin, dass es keine eingebauten Methoden für die Iteration gibt.
Welche der hier im Thread vorgeschlagenen Lösungen am sinnvollsten ist hängt von deinem Anwendungsfall ab, über den du allerdings nicht genug gesagt hast um eine Empfehlung auszusprechen.
Zu erwähnen wäre darum höchstens noch, dass du für Objektmethoden eine im Vergleich zu deinem Beispiel vereinfachte Syntax nutzen könntest:
const object = {
methodName (parameterList) {
// statements
}
};
Viele Grüße,
Orlok