Dominique Stender: Vergleichsoperationen evaluieren ohne eval()

Beitrag lesen

ich muß per JavaScript eine Vergleichsoperation (in einem String) evaluieren, z.B:
var validation = "[WERT] == 'Firma' || [WERT] == 'Familie'";

Der Platzhalter [WERT] wird über Umwege aus HTML Formularfeldern ermittelt, die Strings sind statisch konfiguriert.

...

eval ist nur dann nötig, wenn du zur Laufzeit JS Code erzeugst.

Korrektur: wenn ich zur Laufzeit JS Code _ausführen_ will. Erzeugen ist irrelevant

Andersherum, es gibt keine alternative zu eval, wenn du einen string hast, der JS Code enthält und du ihn ausführen musst.

Stimmt, das ist aber nicht das was ich will. Lies den ersten Satz im Posting hier nochmal: Ich will logische Vergleiche evaluieren, in welcher Sprache die verfasst sind ist unerheblich. Aber natürlich ist es naheliegend bei JavaScript als Sprache auch die Vergleiche in JS-kompatibler Syntax zu verfassen.

Aber fast immer wenn eval benutz wird liegt das eher daran, das jemand nicht weiß wie man Objekte in JS ansprechen kann.

Nur geht es augenscheinlich nicht um Objekte sondern um Werte, aber siehe unten. Im Endeffekt ist der Satz korrekt, aber ich würde ihn umformulieren in "...wenn jemand Werte statt Referenzen auf Werte ansprechen will".

Was willst du machen?

Siehe erster Satz. Was ich _nicht_ will ist
a) JavaScript ausführen.
b) einen kompletten Lexer/Parser selbst schreiben.

Mittlerweile habe ich das Problem so gelöst:

  1. Ich ersetze alle Platzhalter à la [WERT] durch document.forms['formname'].elements['WERT'].value
  2. formuliere alle vergleiche um in um in '(' + vergleich + ') ? true : false'
  3. übergebe validation an eval()

Beispiel:
var evaluation = eval("(document.forms['formname'].elements['WERT'].value == 'Firma') ? true : false || (document.forms['formname'].elements['WERT'].value == 'Familie') ? true : false;")

Und voila, eval() nimmt die Werte in den Formularfeldern und vergleicht sie mit den statisch konfigurierten Werten. Ergo:
a) kein Context-Switching des eval-Lexers
b) keinen Lexer/Parser selbst geschrieben.

Ciao,
Dominique