2

Ich versuche, einen Ausdruck zu bewerten, der Energie enthält, in der Zeichenfolge als **. d. h. eval("(22**3)/12*6+3/2"). Das Problem ist Internet Explorer 11 erkennt dies nicht und wirft Syntaxfehler. Welche Poly-Füllung sollte ich verwenden, um dies zu überwinden? Im Moment verwende ich Modernizr 2.6.2.Math.pow Alternative "**" ES7 Polyfill für IE11

Beispiel Gleichung wäre,

((1*2)*((3*(4*5)*(1+3)**(4*5))/((1+3)**(4*5)-1)-1)/6)/7 
((1*2)*((3*(4*5)*(1+3)**(4*5))/((1+3)**(4*5)-1)-1)/6)/7*58+2*5 
(4*5+4-5.5*5.21+14*36**2+69/0.258+2)/(12+65) 

Wenn es nicht möglich ist, dies zu tun, was sind die möglichen Alternativen?

+0

Es klingt wie Sie Ihren eigenen Parser schreiben müssen. Oder finden Sie eine, die Ihren Bedürfnissen entspricht. –

+3

Ein Polyfill kann hier nicht helfen, da der Code von alten Browsern als Syntaxfehler analysiert wird. Sie müssen den Code transformieren, bevor er vom Browser als Code gelesen wird (vorzugsweise serverseitig mit etwas wie Babel) –

Antwort

0

Sie können keine Polyfill-Operatoren - nur Bibliothekselemente (Prototypen, Konstruktoren, Eigenschaften).

Da Ihre Operation auf einen eval Aufruf beschränkt ist, könnten Sie versuchen, Ihren eigenen Ausdrucksparser zu schreiben, aber das wäre eine Menge Arbeit.

(Als Neben sollten Sie nicht verwenden eval sowieso, aus sehr guten Gründen, die ich in diesem Posting nicht eingehen werde).

Weitere (hack-ish) Möglichkeit ist, einen regulären Ausdruck verwenden triviale Fälle von x**y zu identifizieren und wandeln sie in Math.pow:

function detectAndFixTrivialPow(expressionString) { 

    var pattern = /(\w+)\*\*(\w+)/i; 

    var fixed = expressionString.replace(pattern, 'Math.pow($1,$2)'); 
    return fixed; 
} 

eval(detectAndFixTrivialPow("foo**bar")); 
+0

Eigentlich ist die Gleichung zu lang. Jede Gleichung, die ich analysiere, enthält fast 10-15 Variablen und 5-10 Operatoren. – Prajwal

+0

@ Prajwal Bitte posten Sie weitere Beispiele der Ausdrücke, die Sie dann bewerten. Und beachte, dass es sich nicht um "Gleichungen" handelt, da keine Gleichheit definiert oder erfüllt ist, sie sind * Ausdrücke *. – Dai

+0

Bearbeitete meine Frage durch Hinzufügen weiterer Beispiele. – Prajwal

0

Sie können einen regulären Ausdruck verwenden, um die Vorkommen von ** mit Math.pow() zu ersetzen Anrufungen:

let expression = "(22**3)/12*6+3/2" 
 
let processed = expression.replace(/(\w+)\*\*(\w+)/g, 'Math.pow($1,$2)'); 
 

 
console.log(processed); 
 
console.log(eval(processed));

Es kann jedoch kompliziert werden, wenn Sie verschachtelte oder verkettete Ausdrücke verwenden.

0

Ich denke, dass Sie eine Vorverarbeitung der Eingabe vornehmen müssen. Hier ist, wie ich das angehen würde:

  1. Finden Sie "**" in Zeichenfolge.
  2. Überprüfen Sie, was auf der linken und rechten Seite ist.
  3. Extrahieren Sie "volle Ausdrücke" von links und rechts - wenn es nur eine Zahl gibt - nehmen Sie es wie es ist, und wenn es eine Klammer gibt - finden Sie die passende und nehmen Sie, was als Ausdruck ist.
  4. Ersetzen Sie die 2 Ausdrücke mit Math.pow (links, rechts)