【问题标题】:How can I convert a string into a math operator in javascript [duplicate]如何在javascript中将字符串转换为数学运算符[重复]
【发布时间】:2012-10-16 04:30:15
【问题描述】:

如果我有一个字符串是一个数学方程,我想拆分它然后计算它。我知道我可以使用 eval() 函数来执行此操作,但我很感兴趣是否有其他方法可以执行此操作 - 特别是首先拆分字符串。所以我有类似的东西

var myString = "225 + 15 - 10"
var newString = myString.split(" ");

这会将 myString 变成一个数组:

["225", "+", "15", "-", "10"];

我的下一个任务是将所有奇数字符串转换为整数,我想我可以使用 parseInt();为了。我的问题是,如何将“+”和“-”变成实际的算术运算符?所以最后我会得到一个可以计算的数学表达式?

这可能吗?

【问题讨论】:

标签: javascript


【解决方案1】:

Oliver Morgan 在评论中提到了 JavaScript 的 eval 函数,我只是想说明如何使用 eval 作为解决问题的方法。

eval 函数接受一个字符串,然后返回该字符串的值,将其视为数学运算。例如,

eval("3 + 4")

将返回 7 作为 3 + 4 = 7。

这对您的情况很有帮助,因为您有一个字符串数组,您希望将其视为数学运算符和它们所代表的操作数。

myArray = ["225", "+", "15", "-", "10"]; 

无需将数组中的任何字符串转换为整数或运算符即可编写

eval(myArray[0] + myArray[1] + myArray[2]);

这将转化为

eval("225" + "+" + "15");

这将转化为

eval("225 + 15");

这将返回240,将225与15相加的值。

或者更通用:

eval(myArray.join(' '));

这将转化为

eval("225 + 15 - 10");

这将返回 230,将 15 加到 225 并减去 10 的值。因此,您可以看到,在您的情况下,可以跳过将数组中的字符串转换为整数和运算符,正如 Oliver Morgan 所说,只是eval它。

【讨论】:

  • 我正在考虑在表单验证中使用一些“数学”表达式,而解析器只是矫枉过正。使用eval() 可以让我简单地解析一些字符串,例如<|oh 进行验证(其中oh 引用另一个表单输入类/id/等)。
  • 但不要过多使用eval()。原因有很多:24ways.org/2005/dont-be-eval
  • 永远不要使用 eval。为了任何东西。这是 JS 中的一个巨大的安全漏洞。
  • 如果输入来自用户,这可能很危险
【解决方案2】:

考虑使用isNaN(Number(array[x]))switch 处理不满足条件的任何内容。

【讨论】:

    【解决方案3】:
    var math_it_up = {
        '+': function (x, y) { return x + y },
        '-': function (x, y) { return x - y }
    }​​​​​​​;
    
    math_it_up['+'](1, 2) == 3;
    

    【讨论】:

    • 您好,谢谢。这会起作用——但是如果整个字符串是由用户输入的呢?所以我无法控制字符串中的数字是什么。换句话说,如果这是一个计算器并且用户输入“225 + 15 - 10”,我将字符串拆分,并取任何数字和运算符并将它们转换为数学表达式。在您提供的解决方案中——我将如何自动替换 x 和 y——而不是手动定义它们?
    • 通常我会选择解析器方向(@Esailija 上面提到过),但问题中提供的上下文使它成为一个好的、简单的解决方案。编辑:为了完全控制用户输入,编写一个解析器。
    • 如果 +- 与数字交替出现,您可以简单地循环遍历它。
    • @user1775598,有几种方法可以做到。一种方法是简单地遍历字符串并检查每个元素的 math_it_up 对象上的 hasOwnProperty ;如果为真,则使用数组中的前后索引作为函数的参数调用它。当然,您可能仍想验证这些索引是否存在并且是有效数字...如果您将其扩展到/*,您还需要遵守优先规则...你做的越健壮,它就越接近解析器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    相关资源
    最近更新 更多