1,我现在且一个公式   var gs1='(1)==(2)+(4)+(9)+(10)+(12)';
  var gs2='(4)==(5)+(6)+(7)';
  var gs3='(15)==(16)+(18)+(23)+(24)+(26)';
  var gs4='(18)==(19)+(20)+(21)';这四个公式都是字符串,我写一方法,里有有两个参数,第一个参数是公式(gs1),第二是参数是数组(里面包括1,2,4,9,10,12这个数值)函数功用实现 传进去值通过公式进行运算,返加正确还是错误。function getValue(gs,arr)
{
    
   //计算成功,返回正确
   
   //否则返回错误}大家帮我想想,怎么写。

解决方案 »

  1.   


    var formula = function (exp, args) {
        if (exp.match(/^\(\d+\)==\(\d+\)([\+\-\*\/]\(\d+\))*$/)) {
            for (var i = 0; i < args.length; i++) {
                exp = exp.replace('(' + i + ')', args[i]);
            }        exp = exp.replace(/[\+\-\*\/]?\(\d+\)[\+\-\*\/]?/g, '');
            return eval('(' + exp + ')');
        }
        else {
            throw {
                name: 'Argument error',
                message: 'Expression resolve failed'
            }
        }
    };try {
        //var str = "(2)==(0)+(1)", args = [1, 2, 3];
        var str = "(0)==(1)-(2)*(4)", args = [-62, 2, 4, 8, 16];
        alert(formula(str, args));
    }
    catch (ex) {
        alert(ex.message);
    } 两个结果都为true,我的表达式学的不好,出疏漏还请坛友改进。
      

  2.   

    两个问题,一个是需要考虑除法,另一个是添加策略参数,即当数组无法补齐表达式时的操作。
    exp = exp.replace(/[\+\-\*\/]?\(\d+\)[\+\-\*\/]?/g, '');
    改为下面方式
    exp = exp.replace(/([\+\-\*]\(\d+\))|(\(\d+\)[\+\-\*])/g, '');
    exp = exp.replace(/([\+\-\*\/]\(\d+\))|(\(\d+\)[\+\-\*\/])/g, '');