Berta Benz: mit String Var auslesen

Hallo!

Ich möchte gerne (wie der Titel schon besagt) mit Strings aus einem Array gleichnamige Variablen auslesen:


var Eintraege = ["Eintrag_1", "Eintrag_2", "Eintrag_3"];

var Eintrag_1 = [{hudri: 24} /* etc. */]
var Eintrag_2 = [{wudri: 42} /* etc. */]
var Eintrag_3 = [{oje: 12} /* etc. */]

var testdurchlauf_Var_auslesen = Eintraege.map(function(eintrag) {
	console.log([eintrag]);
})

Ergibt nur leider

["Eintrag_1"]
["Eintrag_2"]
["Eintrag_3"]

...und nicht die gleichnamigen Variablen :(

Wie kann ich über "Einträge" die [dort als String ausgedrückten] Variablen auslesen?

Danke!

  1. Hallo Berta,

    ja, Computer tun immer das, was man ihnen sagt. Das ist nicht unbedingt das, was man will. Der Ausdruck [ 'foo' ] erzeugt ein Array mit einem Eintrag, nämlich dem String "foo". Dementsprechend erzeugt [ eintrag ] ein Array mit einem Eintrag, dessen Wert der Inhalt der Variablen eintrag ist.

    Deine var Angaben zu Eintrag_1, Eintrag_2 und Eintrag_3 erzeugen globale Variablen. Diese findest Du als Eigenschaften des window-Objekts wieder. Mit console.log(window[eintrag]); würdest Du die Werte also bekommen.

    Aber Du solltest das nicht tun. JavaScript-Programme sollten den globalen Scope scheuen wie der Teufel das Weihwasser. Ihr Gebrauch führt bei größeren Programmen oft genug ins Chaos, weil man entweder den gleichen Variablennamen in 2 Modulen versehentlich nutzt, und sich was überschreibt, oder - schlimmer noch - absichtlich nutzt und dann nicht mehr überschaut, wer nun wann und warum an welcher Variablen herumpfuscht. Mach Dir lieber ein Container-Objekt, wo deine „Variablen“ als Eigenschaften drinstehen, das kannst Du dann im Zweifelsfall sauber als Parameter durchreichen bzw. brauchst die Funktion gar nicht mehr.

    var Eintraege = ["Eintrag_1", "Eintrag_2", "Eintrag_3"];
    
    var EintragPool = {};
    EintragPool.Eintrag_1 = [{hudri: 24} /* etc. */];
    EintragPool.Eintrag_2 = [{wudri: 42} /* etc. */];
    EintragPool.Eintrag_3 = [{oje: 12} /* etc. */];
    
    var testdurchlauf_Var_auslesen = Eintraege.map(function(eintrag) {
    	console.log(EintragPool[eintrag]);
    });
    

    Und dann, wenn dein Beispielcode keine globalen Variablen mehr erzeugt, funktioniert der trick mit window[eintrag] sowieso nicht mwehr.

    Rolf

    --
    sumpsi - posui - clusi
  2. @@Berta Benz

    Wie kann ich über "Einträge" die [dort als String ausgedrückten] Variablen auslesen?

    var testdurchlauf_Var_auslesen = Eintraege.map(function(eintrag) {
    	console.log([eval(eintrag)]);
    });
    

    Warum map()? Bist du sicher, dass du nicht sowas willst:

    Eintraege.forEach(eintrag => {
    	console.log(eval(eintrag));
    });
    

    Bist du sicher, dass du das überhaupt willst? Was genau hast du vor?

    LLAP 🖖

    --
    „Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“ —Kurt Weidemann
  3. Ja. nur falsch herum:

    
    var Eintraege = ["Eintrag_1", "Eintrag_2", "Eintrag_3"];
    
    var Eintrag_1 = [{hudri: 24} /* etc. */]
    var Eintrag_2 = [{wudri: 42} /* etc. */]
    var Eintrag_3 = [{oje: 12} /* etc. */]
    
    var testdurchlauf_Var_auslesen = Eintraege.map(function(eintrag) {
    	console.log([eintrag]);
    })
    
    
    
    var Eintrag_1 = [{hudri: 24} /* etc. */]
    var Eintrag_2 = [{wudri: 42} /* etc. */]
    var Eintrag_3 = [{oje: 12} /* etc. */]
    
    var testdurchlauf_Var_auslesen = Eintraege.map(function(eintrag) {
    	console.log([eintrag]);
    })
    

    Ändern in:

    var Eintrag_1 = [{hudri: 24} /* etc. */]
    var Eintrag_2 = [{wudri: 42} /* etc. */]
    var Eintrag_3 = [{oje: 12} /* etc. */]
    
    var Eintraege = ["Eintrag_1", "Eintrag_2", "Eintrag_3"];
    var testdurchlauf_Var_auslesen = Eintraege.map(function(eintrag) {
    	console.log([eintrag]);
    })
    

    Aber wäre nicht

    Eintraege = [];
    
    Eintraege[] = [{hudri: 24} /* etc. */];
    Eintraege[] = [{wudri: 42} /* etc. */];
    Eintraege[] = [{oje: 12} /* etc. */]
    
    var testdurchlauf_Var_auslesen = Eintraege.map(function(eintrag) {
    	console.log([eintrag]);
    })
    

    viel simpler?

  4. hallo

    Hallo!

    Ich möchte gerne (wie der Titel schon besagt) mit Strings aus einem Array gleichnamige Variablen auslesen:

    
    var Eintraege = ["Eintrag_1", "Eintrag_2", "Eintrag_3"];
    
    var Eintrag_1 = [{hudri: 24} /* etc. */]
    var Eintrag_2 = [{wudri: 42} /* etc. */]
    var Eintrag_3 = [{oje: 12} /* etc. */]
    

    ändern zu:

    var Eintrag = {
       Eintrag_1: [{hudri: 24} /* etc. */],
       Eintrag_2: [{wudri: 42} /* etc. */],
       Eintrag_3: [{oje: 12} /* etc. */]
    };
    

    var testdurchlauf_Var_auslesen = Eintraege.map(function(eintrag) { console.log([eintrag]);

    ändern zu

    console.log( eintrag + ": ", Eintrag[eintrag] );

    })

    1. Hallo, danke mal an alle :)

      ...ja, sowas Ähnliches hatte ich schon befürchtet…

      Prinzipiell geh ich mit Rolf konform, dass das Window-Objekt keine Lösung ist (vor allem, weil das Teil vielleicht auch mal als Desktop Variante ohne 'Window' laufen soll...)

      Blöderweise arbeitet sämtlicher folgender Code mit den Eintrag_1, _2, _3 Variablen, der müsste mit einem zusätzlichen Container-Objekt adaptiert werden...

      Klassisch falsch / bzw. unzureichend geplant :(

      1. Hallo Berta,

        Desktop Variante ohne 'Window' laufen soll..

        Das wäre jetzt nicht der absolute Killer - auch node.js hat ein globales Objekt, es heißt nur nicht window sondern global. Der Unterschied zwischen node und Browser ist aber, dass eine var blabla Angabe in einem Modul die Variable nicht global anlegt, sondern lokal zum Modul, d.h. du musst schon gezielt an das global-Objekt zuweisen, um da auch was drin zu haben.

        Aber tu es nicht. Saniere und modularisiere lieber deinen Code. Beschäftige Dich mit Namensräumen bzw. dem Modul-Pattern von JavaScript. Alternativ zum Modul-Pattern mit IIFEs lerne das Modulkonzept von ECMAScript kennen (ein Einstieg wäre z.B. hier)

        Dein ein Jahr älteres Ich wird es Dir auf Knien danken.

        Rolf

        --
        sumpsi - posui - clusi