Globale Variablen innerhalb globalem Array ändern / ausgeben

TIMS_Ralf

Erfahrenes Mitglied
Hallo Leute!

Habe ein globales, assoziatives Array "Tooltipp", welches - ebenfalls global definierte - Variablen "Hd0, Hd1, Dt0, Dt1..." enthält. Verschiedene Funtionen sollen dieses Array ranziehen, enthaltene Variablen ändern und ausgeben. Mir unverständlicher Weise werden die Änderungen in den Funktionen nicht in die globalen Variablen des Arrays geschrieben. Das Array selbst funktioniert ebenso, wie die Funktionen. JS-Editor und Firebug melden auch keine Fehler?

Beispiel mit einer Mini-Funktion ( Man könnte einiges eleganter machen... soll nur ein kurzers, unkompliziertes Beispiel sein)

Code:
// Globale Variablen:
var

Hd0 = "Ursuppe_Hd0",
Hd1 = "Ursuppe_Hd1",
Dt0 = "Ursuppe_Dt0",
Dt1 = "Ursuppe_Dt1",

Tooltipp = new Array();
 Tooltipp[0] = new Object();
  Tooltipp[0]["head"] = Hd0 + " zeigen";
  Tooltipp[0]["data"] = "Das " + Dt0 + " für " + Dt1 + " jetzt anzeigen?";
   
 Tooltipp[1] = new Object();
  Tooltipp[1]["head"] = Hd0 + " kaufen"; // in Gebrauch: Dtl
  Tooltipp[1]["data"] = "Das " + Dt0 + " für " + Dt1 + " jetzt kaufen?";
   
 Tooltipp[2] = new Object();
  Tooltipp[2]["head"] = Hd0 + " ändern";
  Tooltipp[2]["data"] = "Das " + Dt0 + " für " + Dt1 + " jetzt ändern?";

// HTML-Funktionsaufruf, z.B. OnMouseOver="TTip(Tooltipp,2,'Tolle Angebote#','Angebot#Schuhe')"
function TTip(Array, ArrayNr, HeadTexte, DatenTexte)
{
	
 var 
 ArrayHead, ArrayData;
 
 // Variablen für Array-Objekt "berechnen":
 ArrayHead = HeadTexte.split('#');
 Hd0 = ArrayHead[0];
 Hd1 = ArrayHead[1];
 Hd2 = ArrayHead[2];
 
 ArrayData = DatenTexte.split('#');
 Dt0 = ArrayData[0];
 Dt1 = ArrayData[1];
 Dt2 = ArrayData[2];
 
	// Test:
	// Array korrekt ausgelesen, Variablen gesetzt...
	// aber eben nicht im Array-Objekt... ****?
	
 alert("Hd0 = " + Hd0 +
       "\nArray-Head = " + pyTtp[pTtpNr]["head"]);
       "\n\n Dt0 = " + Dt0 +
       "\n Dt1 = " + Dt1 +
       "\n Array-Data" + pyTtp[pTtpNr]["data"]);

}

Kann mir bitte jemand auf die Sprünge helfen, weshalb das nicht funktioniert - und wie es funktioniert!?

Vielen Dank vorab,
Gruß Ralf
 
Habe ein globales, assoziatives Array "Tooltipp", welches - ebenfalls global definierte - Variablen "Hd0, Hd1, Dt0, Dt1..." enthält
Falsch. Dein Array bzw. die Objekte in deinem Array enthalten keine Variablen sondern strings.
Die strings ändern sich nicht nur weil du die Variablen änderst.
Sie bleiben so wie sie definiert wurden.
Es gibt keine referenzen mehr auf Variablen;

Schau dir mal folgendes Beispiel an dann sollte es klar werden:
Javascript:
var a = "foo";
var b = "bar";
var c = a + b;
console.log(c); // foobar
a = "bla";
b = "blubb";
console.log(c); // foobar
c = a + b;
console.log(c); // blablubb
 
Hallo rd4eva,

danke erstmal...! Ja neee... das Arrayobjekt enthält strings und globale Variablen, die zu einem "lesbaren" Satz führen sollen: Tooltipp[0]["head"] = Hd0 + " jetzt anzeigen?";

Wenn ich die Variable Hd0 mit "Tolles Angebot" füllen, müsste ein
Code:
 alert(Tooltipp[0]["head"] );
ausgeben: "Tolles Angebot jetzt anzeigen?"

Solange Array und Variablen lokal innerhalb der Funktion liegen, funktioniert das alles bestens. Nur sobald ich Array und Variablen global deklariere, werden die Variablen zwar gefüllt, aber nicht mehr im Objekt. Ich bekomme nur zurück " jetzt anzeigen?".

Ich kriegs nicht aufn Schirm...
 
... der Groschen ist noch nicht gefallen, aber er klimpert :) ... Das heißt, die Objekte im Array können nur einmal deklariert und die Inhalte danach nicht mehr verändert werden - die haben dann stets den fertigen String fix enthalten?

Wie soll dann das Objekt innerhalb der Funktion neu deklariert werden, wenn es dort nun nur noch fix ist?
 
Zuletzt bearbeitet:
Das hab ich nicht gesagt. Die Werte in einem Objekt oder Array sind nicht fix die kannst du verändern wie du fröhlich bist.
Aber wenn du z.B. folgende deklaration machst
Javascript:
Tooltipp[0]["head"] = Hd0 + " jetzt anzeigen?";
dann wird (um den string zu erzeugen der im endeffekt in Tooltipp[0]["head"] steht ) die Variable Hd0 nur ein einzigies mal aufgelöst.
Du kannst dann Hd0 ändern soviel du willst. Der string und somit der Wert in Tooltipp[0]["head"] wird gleich bleiben.
Wenn du nun willst das in Tooltipp[0]["head"] der jeweils aktuelle Wert von Hd0 berücksichtigt wird dann musst du die Zuweisung eben einfach nochmal machen.
Das hat auch überhaupt nichts mit Arrays oder Objekten zu tun.
Das ist einfach Grundsätzlich so.
 
Guten morgen, mal drüber geschlafen hilft :-)

Eine Lösung wäre, in die Array-Objekte Strings (Head0, Head1...) zu setzen und diese Teilstrings aus den Objekten mit RegEx zu ersetzen. Das dürfte funktionieren und bleibt flexibel:

Code:
var
TooltippHd = Tooltipp[Nr]["head"],
TooltippDt = Tooltipp[Nr]["data"];
 
// Ersetze Head
 HeadTexte= TooltippHd .split("#");
// hier könnte ne elegante FOR-IN Schleife kommen.., hier mal ohne:
 if( TooltippHd.search(/Head0.+/) != -1) TooltippHd = TooltippHd.replace(/Head0/g, HeadTexte[0]);
 if( TooltippHd.search(/Head1.+/) != -1) TooltippHd = TooltippHd.replace(/Head1/g, HeadTexte[1]);
 if( TooltippHd.search(/Head2.+/) != -1) TooltippHd = TooltippHd.replace(/Head2/g, HeadTexte[2]);
// ... data ...

Dein Hinweis "neu deklarieren" interessiert mich, wüsste aber nicht wie ich das hinbekomme. Könntest Du mir bitte ein Snippet geben, wie ich das globale Array-Objekt innerhalb der Funktion neu deklariere und mit Variablen füllen kann?

Danke erstmal... Problem habe ich verstanden!
Ralf
 
Eine Lösung wäre, in die Array-Objekte Strings (Head0, Head1...) zu setzen und diese Teilstrings aus den Objekten mit RegEx zu ersetzen. Das dürfte funktionieren und bleibt flexibel:
Wenn du dir dein Leben unnötig schwer machen willst kannst du das machen.

Dein Hinweis "neu deklarieren" interessiert mich, wüsste aber nicht wie ich das hinbekomme
Indem du ganz einfach nochmal das gleiche schreibst?!
Javascript:
Tooltipp[0]["head"] = Hd0 + " jetzt anzeigen?";

Oder du machst etwas derartiges:
Javascript:
var Hd0 = '',
    Hd1 = "Ursuppe_Hd1",
    Dt0 = "Ursuppe_Dt0",
    Dt1 = "Ursuppe_Dt1",
    
Tooltipp = {
    0 : {
        head : function() { return Hd0 + "zeigen"; },        
        data : function() { return "Das " + Dt0 + " für " + Dt1 + " jetzt anzeigen?"; }
    }
};

 
function TTip(Array, ArrayNr, HeadTexte, DatenTexte)
{
    var ArrayHead;
    
    ArrayHead = HeadTexte.split('#');
    Hd0 = ArrayHead[0];    
    
    console.log(Tooltipp[ArrayNr].head());
}

Btw dein Problem ist überhaupt kein wirkliches Problem. Es hat auch nicht mit Arrays, Objekten, lokalen oder globalen Variablen zu tun.
Du verstehst nur die Grundlagen der Sprache nicht wirklich.
Deswegen würde ich dir raten erstmal ein stark vereinfachtes Beispiel zu verwenden bis du es tatsächlich verstanden hast.
Hier z.B: http://jsfiddle.net/M93W9/
 
Zuletzt bearbeitet:
Hallo rd4eva,

nochmals vielen Dank! Äääh... ja, dass ich mit
Code:
Tooltipp[0]["head"] = Hd0 + " jetzt anzeigen?";
das Objekt innerhalb der Funktion neu schreiben kann ist schon klar.

Das globale Array hat aber über 100 Objekte, die vollkommen unterschiedlich aufgebaut sind, unterscheidlich viele Variablen an unterschiedlichen Stellen enthalten. Dann müsste ich ja das komplette Array innerhalb der Funktion nochmal neu belegen. Dann könnte ich das Array ja auch wieder lokal führen (läuft bestens). Ich möchte nun aber der function ein beliebiges Array als Paramter übergeben können.


Aber zugegeben: Das verstehe ich evtl. nicht ganz:
Code:
Tooltipp = {
    0 : {
        head : function() { return Hd0 + "zeigen"; },        
        data : function() { return "Das " + Dt0 + " für " + Dt1 + " jetzt anzeigen?"; }
    }
};

Ich deklariere damit eine neue Variable "Tooltipp", die mit " 0 : " das Objekt 0 anlegt und mittels den Funktionen die beiden Inhalte zurück liefert, die ich zuvor in der Funktion berechnet habe ?
Aber auch damit müsste ich doch jedes Objekt des Arrays neu anlegen...****?


Nach wie vor vielen Dank für Deine Infos!
Gruß, Ralf
 
Zuletzt bearbeitet:
Meine Variante verwendet einfach Funktionen anstatt "feste" strings, was bedeutet das die jeweils aktuellen Werte der Variablen berücksichtigt werden.
D.h. du brauchst nur noch z.B. Hd0 zu setzen und dann Tooltipp[0].head() aufzurufen.
Und ja das bedeutet du müsstest jedes Objekt innerhalb deines Arrays ein mal neu anlegen.

Eine andere alternative wäre so etwas wie sprintf zu verwenden.
 

Neue Beiträge

Zurück