需求:用户在页编写了一个公式,我需要检验公式的正确性,然后传给后端,让后端计算
//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执行便可以告诉我们这不是一个正确的数学公式
*/