一个惊为天人的验证思路(验证数学公式是否正确)

23 篇文章 0 订阅

需求:用户在页编写了一个公式,我需要检验公式的正确性,然后传给后端,让后端计算


    
    //list便是用户编写的公式,每一个数组元素都是公式的组成
    
    //譬如:(base_data + base_data2)/10 本质就是下面的list数组
    //type 0为系统数据采集(表示这个值需要后端从数据库读取)
    //type 1为数学符号 (+、-、*、/这些数学符号)
    //type 2为用户手动输入的数字(表示这个值是用户手动输入的)
    const list = [{
            type: 1,
            value: null,
            code: "(",
        },
        {
            type: 0,
            value: null,
            code: "base_data",
        },
        {
            type: 1,
            value: "",
            code: "+",
        },
        {
            type: 0,
            value: "",
            code: "base_data2",
        },
        {
            type: 1,
            value: null,
            code: ")",
        },
        {
            type: 1,
            value: null,
            code: "/",
        },
        {
            type: 3,
            value: 10,
            code: null,
        },
    ];
    const str = list.map(item => {
        if (item.type == 1) {
            return item.code
        } else {
            //空格,一定要多写一个空格
            return '1 '
        }
    })
    
    try {
        new Function("return " + str)
        console.log('这是个正确的公式!!');
    } catch (error) {
        console.log('这不是个正确的数学公式!!');

    }
    //why?为什么要按照上面的map进行判断?
    /*
    1、根据我们这边接口文档了解
    当type=1时表示为数学符号,我们应该读取code字段
    当type=2时表示手动输入,我们应该读取value字段
    当type=0时表示系统提取数据、我们应该看code字段
    
    2、我需要在传递公式给后端前,验证公式的正确性。
    譬如:1+1  √
    (1+1)/2    √
    1++12    × 多了一个‘+’
    1+12+    × 同样多了一个‘+’

    3、遍历list
    如果type = 1我们直接返回这个数学符号即可
    如果type = ‘其它(0、2)’  我们用一个固定数字来代替(因为不管是后端读取还是用户输入,最终在后端那边都是一个数字,我们直接用1来代替这个数字)
    我们用固定值‘1’代替系统读取与手动输入的值

    4、利用new Function可以实现字符串转为函数运行

    在完成上面的条件后,公式仅仅可以保证部分的正确性

    譬如:
    list = [
        {
            type:"0",
            code:'base_data',
            value:null
        },
        {
            type:"0",
            code:'base_data2',
            value:null
        },
    ]
    这种情况,最终转为公式为 “系统读取的base_data”“系统读取的base_data2”
    我们用固定值‘1’替换后为:‘1’‘1’,我们用new Function()执行发现不会有任何问题,直接返回最终结果‘11’。

    因此我们就需要在1后面加一个空格,
    公式:“系统读取的base_data”“系统读取的base_data2”  转为  '1 ''1 '
    new Function执行便可以告诉我们这不是一个正确的数学公式


    */

   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值