如何将变量表达式转换为可执行代码(而不是替换值)

How do you convert a variable expression to executable code (not to substitute values in)

本文关键字:替换 代码 可执行 变量 表达式 转换      更新时间:2024-01-27

我现在正在做一个个人项目(我正在尝试用javascript中的给定表达式绘制一个图形(,我遇到了一个问题。

s = "3x^2+4x+5",我正在尝试将其转换为return 3*x*x + 4*x + 5,在函数中

myGraph.drawEquation(function(x) {
    return 3*x*x + 4*x + 5;
}, 'green', 3);

我环顾四周,遇到了eval(),但它需要将值替换为x。其他指南说我需要制作自己的解析器,但是您如何创建一个执行上述操作的解析器?

目前我有一个函数 将s = "3x^2+4x+5"转换为["+3x^2","+4x","+5"]转换为["+3*x*x","+4*x","+5"] ,如果有帮助的话。

(抱歉多次编辑(

您可以使用 math 的表达式解析器.js为此,它支持定义函数:

var f = math.eval('f(x) = 3x^2+4x+5');
console.log(f(1)); // outputs 12
console.log(f(2)); // outputs 25
console.log(f(3)); // outputs 44

math.js有自己的表达式解析器,它不使用JavaScript的eval函数。

如果你有这个 ["+3*x*x","+4*x","+5"]

然后你可以做下面这样的事情来评估。

// Code goes here
function myFunction(){
  //alert('loaded')
  var myexpr = ["+3*x*x","+4*x","+5"];
  var expr = "";
  for(s in myexpr)
  {
    expr += myexpr[s];
  }
  expr = "y = "+expr
  setH1Text(expr);
  
  myEval(expr,"x = 1");
}
function setH1Text(text)
{
  document.getElementById('jenish').innerHTML = text;
}
function myEval( ex,  ex1)
{
  var evaltobeexecuted  = ex1+";"+ex
  
  eval(evaltobeexecuted)
  setH1Text(y);
  //alert(y)
}
<!DOCTYPE html>
<html>
  <head>
    <link rel="stylesheet" href="style.css">
    <script src="script.js"></script>
  </head>
  <body onload="myFunction()">
    <h1 id="jenish">Hello Plunker!</h1>
  </body>
</html>

注意:您需要在myEval函数中放置一些x = 2传递给第二个表达式的替换。 最终你也可以像我一样构建主表达式expr

注意:使用Eval是邪恶的。它带来了跨站点脚本等安全问题。

你也可以使用数学.js(我强烈推荐你使用已经构建的,如果可能的话:)(

function myFunc()
{
  var scope = {
  x: 2
  };
    
    var f = math.eval('f(x) = 3x^2+4x+5', scope);
    alert(f(2));
  }
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjs/1.3.0/math.js"></script>
<body onload="myFunc()">
  
</body>

你需要一些有规律的表达教育。这仍然无法解决x问题,但值得一看:

function youreWelcome(str, x){
  return str.replace(new RegExp('('+x+')', 'g'), '*$1').replace(new RegExp('('+x+')''^(''d)+', 'g'), function(m, p1, p2){
    var r = [];
    for(var i=0; i<p2; i++){
      r.push(p1);
    }
    return r.join('*');
  });
}
console.log(youreWelcome('3x^2+4x+5', 'x'));
console.log(youreWelcome('7n^3+42n^5+8', 'n'));

当您尝试解决x时,请查看Math.pow()

看看这个:

JavaScript:计算一个数字的第n个根