使用eval循环数学运算符

时间:2017-10-21 22:26:32

标签: javascript

var toyProblem = function () {
  var sol= 0;
  var operators = ['+','-','*','/'];
  console.log(sol)

    for(var i in arguments){
      for(var j in operators){
        sol = eval(sol + (operators[j]) + arguments[i]);
      }
    }

  return sol;

 }

 toyProblem(6, 0, 10, 3); //6 + 0 - 10 * 3 === -12)

我尝试在4个数学运算符中循环输入未知数量的输入值。我想在循环中使用eval作为一种既可以通过未知数量的参数同时也可以更改数学运算符的方法。在底部是我想要达到的解决方案。这是解决这个问题的好方法,还是我咆哮错误的树?

5 个答案:

答案 0 :(得分:0)

嵌套2个循环将导致6 + 6 - 6 * 6 / 6 + 0 - 0 * 0 / 0 + 10 - 10 * 10 / 10 + 3 - 3 * 3 / 3

我没有找到办法在没有eval的情况下执行此操作,因为逐个循环操作会修改运算符优先级,所以这就是我的建议:构建一个操作'查询'评估并返回。

希望这有帮助



var toyProblem = function () {
  var operation = '';
  var operators = ['+','-','*','/'];
  var args = Array.from(arguments);

    args.forEach(function (arg, index) {
      if (index > 0) {
        operation += operators[index - 1];
      }
      operation += arg;
    });

  return eval(operation);

}
console.log(6 + 0 - 10 * 3);
console.log(toyProblem(6, 0, 10, 3)); //6 + 0 - 10 * 3 === -24)




答案 1 :(得分:0)

让我们分解问题。你有variadic function接受未知数量的参数,并根据该元素的索引将操作符应用于每个下一个参数。

因为参数的数量可能大于运算符的数量,所以在通过参数列表时,使用modulo operator无限循环遍历运算符数组是合适的。

eval操作接受一个字符串,对其进行求值,并返回字符串表示的表达式的求值结果。所以你走在了正确的轨道上。但由于eval函数将字符串作为第一个参数,我建议使用template literals,它本地supported in almost all browsers并且不需要进行转换进入好老的ES5。

然后函数看起来像这样:

function toyProblem(first = 0, ...args) {
  const operators = ['+', '-', '*', '/'];
  let sol = first;

  for (let i in args) {
    sol = eval(`${sol} ${operators[i % operators.length]} ${args[i]}`);
  }

  return sol;
}

但是,正如评论中建议的那样,使用eval并不是您想要发送给用户的内容。相反,我建议使用功能。 Javascript中的函数是first-class citizens,因此您可以将它们作为参数传递。

想象一下,你有一个函数(a, b) => a + b而不只是一个字符串"+"。代码将如下所示:

function toyProblem(first = 0, ...args) {
  const operations = [
    (a, b) => a + b,
    (a, b) => a - b,
    (a, b) => a * b,
    (a, b) => a / b,
  ];
  let sol = first;

  for (let i in args) {
    sol = operations[i](sol, args[i]);
  }

  return sol;
}

您可以更进一步,使功能在可能的操作方面具有普遍性。玩得开心!

答案 2 :(得分:0)

由于您正在对运算符的名称进行硬编码,因此您可以对函数进行硬编码并避免使用eval。您将函数放入一个允许您循环的数组中。然后你可以通过一个简单的单行来减少参数,它将处理任意数量的参数:

const op = [
    (a, b)  => a + b,
    (a, b)  => a - b,
    (a, b)  => a * b,
    (a, b)  => a / b
]

function prob(...args){
    return args.reduce((curr, acc, idx) =>  op[(idx - 1) % op.length](curr, acc))
}
console.log(prob(6, 0, 10, 3))
console.log(prob(6, 0, 10, 3, 20, 11, 15, 100))

答案 3 :(得分:0)

要获得产品-12,需要在括号内评估表达式的前三部分,否则结果将为-24。在输入数组上调用String.prototype.replace()后,可以使用","替换.toString()个字符,将","替换为运算符,从{{1返回表达式(6 + 0 - 10) * 3构造函数

Function()

答案 4 :(得分:0)



AssetManager