eval() für Arrays?

TIMS_Ralf

Erfahrenes Mitglied
Hallo Forum!
habe einen String, der Texte, Variablen, normale Arrays und assoziative Arrays enthält, entspr. gesplittet und dann zusammengestezt werden soll. Die Variablen müssen im String sein! Mit "neuer String = neuerString + eval(variable);" funktioniert das. Es funktioniert leider nicht, wenn die Vraibale ein Array / assoziatives Array
ist.
Mit stark vereinfachten (=blöden) Variablen :)... :

Javascript:
// HTML: ONCLICK="VarString(TestString, 0)"

// JS:
var
TestText = "Brief",
TestArray = new Array("eMail", "Fax", "Post");

AssozArray = new Array();
AssozArray[0] = new Object();
AssozArray[0]["Name1"] = "Herr Maier";
AssozArray[0]["Name2"] = "Frau Müller";
AssozArray[0]["Name3"] = "Herr Schulze";
AssozArray[0]["Name4"] = "Hinz und Kunz";
TestString = "Diese #|TestText|# geht per #|TestArray|1|# an #|ArrayName|0|Name4|# noch heute heraus.";

function VarString(pStr, pyArr)
{
   var
arrayStr = new Array(),
arrayVarStr = new Array(),
cntI = 0,
vNm  = "",
arrayNm  = "",
arrayNr  = 0,
arrayObj = "",
tempString = "",
NeuerString = "";

// gesamter String in Texte, Vars, Arrays splitten:
arrayStr = pStr.split("#");
// Schleife: Gesamten String nach Text / Variablen / Arrays durchforsten, dann neu splitten
for(cntI=0; cntI<arrayStr.length; cntI++)
{
  arrayVarStr = arrayStr[cntI].split("|"); // SubArray aus yStr splitten
  switch(arrayVarStr.length)
  {
   case 1: tempString = arrayStr[cntI]; break; // Keine Variable sondern Text
   case 3: tempString = eval(arrayVarStr[1]); break; // Einfache Variable: #|Var|#
   case 4:  // Einfaches Array: #|Array|Nr|#
   switch(arrayVarStr[1])
   {
    case "0": arrayNm = "_arrayDmn"; break; // Standard-Array der Domain / des Kunden
    case "1": arrayNm = "pyArry"; break; // übergebenes Array
    default: arrayNm = arrayVarStr[1]; // beliebiges Array
   }
   arrayNr = parseInt(arrayVarStr[2]);
   tempString = eval(arrayNm[arrayNr]);
   break;
  case 5: // Assoz-Array mit Entscheid welches Array: #0/1/2/3|Array|Nr|Nm|#
  // alert("assoz Array");
  switch(arrayVarStr[1])
  {
   case "0": arrayNm = "arrayDmn"; break;  // Standard-Array
   case "1": arrayNm = "pyArry"; break; // übergebenes Array
   default:  arrayNm = arrayVarStr[1];  // beliebiges Array
  }
  arrayNr = parseInt(arrayVarStr[2]);
  arrayObj = arrayVarStr[3];
  tempString = eval(arrayNm[arrayNr][arrayObj]);
  break;
  default: alert("Fehler");
}
NeuerString = NeuerString + tempString;
}
return NeuerString;
}

Während case 1 (Text) und 2 (eval(variable)) funktionieren, funktioniert das eval() in case 4 und 5 bei Arrays nicht. Verschachtelte evals(...) funktionieren da auch nicht.

Frage: Wie bekomme ich ein Array aus einem String heraus?

Danke vorab für Mühen und Tipps!
Ralf
 
Zuletzt bearbeitet von einem Moderator:
Hallo Ralf,

bei deinem Code blicke ich nicht ganz durch, was du mit eval() vorhast.
Kannst du vielleicht allgemein erläutern, was du mit eval() versuchst zu erreichen?
Abgesehen davon, dass eval() einen String (mit JS) als Parameter erwartet, solltest du diese Funktion in 99% aller Fälle nicht benutzen!


PS: Bitte nutze JavaScript-Codetags das nächste Mal: http://www.tutorials.de/help/bb-codes#codetag
 
Hallo ComFreak,
erstmal danke! Ja, ich weiß... benutzte eval() nur ungern, weil der JS-Interpreter da eben wirklich nur "versucht" zu interpretieren. Manchmal klappts ja, manchmal auch nicht... Okay, anders gefragt:

Habe Variablen und Arrays, bekomme einen String, der geparst werden soll. Der String kann Texte, Variablen, normale Arrays und assoziative Arrays enthalten: Zum Parsen wird der String zunächst in seine Bestandteile gesplittet:
Javascript:
// Beispiel gegebenes Array:
ArrayName = new Array();
ArrayName[0] = new Object();
ArrayName[0]["Name4"] = "Hinz und Kunz";

der_string = "Diese #|TestText|# geht per #|TestArray|1|# an #|ArrayName|0|Name4|# noch heute heraus.";
// Split 1:
array_des_string= = der_string.split("#");

Erhalte ein Array mit 7 Splits (Strings), die jeweils entweder Text, oder eine Variable, oder ein normales Array ODER ein assoziatives Array enthalten können:
1. "Diese " = ist normaler Text
2. "|TestText|" = steht für eine Variable
3. " geht per " = ist normaler Text
4. "|TestArray|1|" = steht für ein normaels Array
5. " an " = ist normaler Text
6. "|ArrayName|0|Name4|" = steht für ein assoziatives Array
7. " noch heute heraus." = ist normaler Text

Nach weiterem Split erhalte ich die Komponenten je erstem Split in weiteren Splits - hier am Beispiel 6:
Javascript:
// Split 2 - "|ArrayName|0|Name4|"
array_des_array = array_des_string[6].split("|");

Ich erhalte folgende Strings aus "|ArrayName|0|Name4|" gesplittet und schreibe sie in Variablen:
6.1. array_name = "ArrayName"
6.2. array_nr = "0" - muß umgewandelt werden: array_nr = parseInt(array_nr);
6.3. array_object = "Name4"

Ich brauche nun "Hinz und Kunz" aus dem Array, wozu ich nur die Splits aus dem String habe. Das sollte (zumindest analog zu Variablen) mit eval() so funktionieren:
Javascript:
Inhalt_Array = eval(array_name[array_nr][array_object]);

Neee, funktioniert nicht - ich bekomme in Inhalt_Array = "undefined" zurück, statt "Hinz und Kunz". FireBug, IE-Konsole etc. melden keine Fehler. Ich brauche aber "Hinz und Kunz" zurück :):mad: ... entweder mit "eval()" oder auch sonst irgendwie...? Ich kann nur den String LEIDER nicht ändern - den bekomme ich so fix und fertig.
 
Zuletzt bearbeitet:
Nun, da wir (oder ich) eval() vermeiden möchten, musst du in der Lage sein, mittels eines Strings auf deine Array-Variable zugreifen zu können.
Bei lokalen Variablen innerhalb einer Funktion (var) ist das nicht möglich. Du musst entweder globale Variablen (nicht empfohlen) nutzen oder eine weitere hierarchische Ebene aufbauen:
Javascript:
// Globale Variablen (nicht empfohlen)
function test_function1() {
  window.ArrayName = [];
  // window.ArrayName füllen

  // Folgende Werte erhälst du eigentlich dynamisch (d. h. mit "TestString")
  // Zur Einfachkeit hier schon erledigt
  var array_name = 'ArrayName';
  var array_nr = 0;
  var array_object = 'Name4';

  // "Hinz und Kunz"
  alert(window[array_name][array_nr][array_object]);
}

// Mittels einer weiteren hierarchischen Ebene
function  test_function2() {
  var data = {ArrayName: []};
  // data.ArrayName füllen

  // Folgende Werte erhälst du eigentlich dynamisch (d. h. mit "TestString")
  // Zur Einfachkeit hier schon erledigt
  var array_name = 'ArrayName';
  var array_nr = 0;
  var array_object = 'Name4';

  // "Hinz und Kunz"
  alert(data[array_name][array_nr][array_object]);
}
Live-Beispiel der letzten Funktion: http://jsfiddle.net/su5hj6uo/2/

Tauscht man in eval() einen Buchstaben, so erhält man schon das desaströse Wesen dieser Funktion: "evil"!

Spaß beiseite, wenn du dein Ergebnis wirklich damit erreichen willst:
Javascript:
alert(eval(array_name + '[' + array_nr + ']["' + array_object + '"]'));
Live-Beispiel: http://jsfiddle.net/su5hj6uo/4/
Nicht nur hast du dein allen Nachteile von eval() ausgesetzt, du hast auch noch eine Inkompatibilität mit möglichen Anführungszeichen in array_object auf die Schnelle mal eingeführt.
 
Hey ComFreek!
neeee... Spaß muß man nicht beiseite lassen... :) Ich gestehe, ich bin auch schon mal "evil":

Habe "generell" mehrere Instanzen, auch globale Variablen. Das funktioniert zwar, nur das mit der "Übersicht-behalten" ist dann mit der Zeit so ne Sache... Da sucht man sich manchmal n Wolf bei Fehlern. Aber wenn man ein paar ordentlich Datenstrukturen aufbaut, dann gehts...

Zur Sache: Ja SUPER und Danke! Auch für die Mühe bei fiddle!
Den eval auch noch "zusammenbauen"... da bin ich nicht drauf gekommen. Hatte die eval`s sogar schon verschachtelt - aber jetzt, wo Du es sagst... :)

Okay, gelöst! DANKE!

P.S.:
Melde mich demnächst nochmal wegen meiner jQuery-Scripts, die ich mit Paramtern über Funktionen aufrufen muß (will). Dein Tipp mit jQuery-"click"-function war schon klar, aber der Click muß von einem HTML-Event-Handler ausgelöst werden.
Das ist die Sch..... wenn man prähistorische Codes auf steinzeitlichen WEB-Seiten hat, die noch klein jQuery kennen...
 

Neue Beiträge

Zurück