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

时间:2015-02-20 02:23:48

标签: javascript

我现在正在处理个人项目(我试图在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"],如果有帮助的话。

(对不起多次修改)

3 个答案:

答案 0 :(得分:1)

  
    

如果您有[" + 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>
&#13;
&#13;
&#13;

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

警告:使用Eval是邪恶的。它会导致跨站点脚本等安全问题。

您也可以使用Math.js(我强烈推荐这个,如果可能的话,只使用已经构建的那些:)。

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

答案 1 :(得分:1)

为此可以使用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函数。

答案 2 :(得分:0)

您需要接受正规表达教育。这仍然不能解决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'));

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

检查出来:

JavaScript: Calculate the nth root of a number