Javascript 实现类似 Excel 的公式解析计算功能

目录

  • 背景
  • 思路
  • 实现

背景

最近在做一个工资系统,有的工资项可以根据用户自定义的公式来自动计算,类似于Excel中定义好公式后,可以计算一样。

比如应发工资计算公式为:应发工资 = 基本工资 + 绩效考核奖 + 加班工资
实发工资 = 应发工资 - 代扣养老保险 - 代扣住房公积金
对应代码为:n07=n00+n04+n05
n10=n07-n08-n09

思路

  1. 使用正则表达式匹配计算公式找到工资项代码(n00,n04,n05)
  2. 逐项将匹配到的工资项代码替换成对应的值
  3. 使用 eval() 来执行计算公式得出结果

实现

变量 名称 部分数据展示
detailList 人员数据 [{id: ‘1’, name: ‘张三’, n00: 10000, n01: 500, n02: 500, n03: 500, n04: 500, n05: 500, n06: 500, n07: 0, n08: 500, n09: 500, n10: 0}, {id: ‘2’, name: ‘李四’, n00: 15000, n01: 500, n02: 500, n03: 500, n04: 500, n05: 500, n06: 500, n07: 0, n08: 500, n09: 500, n10: 0}]
detailHead 人员表头数据 [{id: “166ada0c5992441fba1bfc1159e9a846”, itemId: “0”, itemName: “基本工资”, itemCode: “n00”, designFormulas: “”}, {id: “d26afa0c3902471fba1bfc1155e9a848”, itemId: “4”, itemName: “绩效考核奖”, itemCode: “n04”, designFormulas: “”}, {id: “324afa0c3902441fba1bff1155e9a541”, itemId: “5”, itemName: “加班工资”, itemCode: “n05”, designFormulas: “”}, {id: “424dfa0c3a02a41fba1bff115ae9a516”, itemId: “7”, itemName: “加班工资”, itemCode: “n07”, designFormulas: “n00+n04+n05”}, {id: “a24dfa0c3a02a41fba1bfd115ae9a51a”, itemId: “8”, itemName: “代扣养老保险”, itemCode: “n08”, designFormulas: “”}, {id: “b24dfa0c3a02a41fba1bff115a39a51f”, itemId: “9”, itemName: “代扣住房公积金”, itemCode: “n09”, designFormulas: “”}, {id: “c24dfa0c3a02a41f4a1bff115ae9a515”, itemId: “10”, itemName: “实发工资”, itemCode: “n10”, designFormulas: “n07-n08-n09”}]
designFormulas 计算公式
itemCode 工资项代码 对应计算公式里的项
this.detailList.map(item=> {
     
   this.detailHead.map(dh=> {
     
       if(dh.designFormulas) {
     
           let designFormulasCopy = dh.designFormulas;
           let itemList = designFormulasCopy.match(/[A-Za-z]+[0-9]{2}/g) || [];
           //逐项替换
           for(let i = 0; i < itemList.length; i++) {
     
             let code = designFormulasCopy.match(/[A-Za-z]+[0-9]{2}/);
             designFormulasCopy = designFormulasCopy.replace(code[0], item[code[0]]);
           }
           //将结果赋值给当前工资项
           this.$set(item, dh.itemCode, eval(designFormulasCopy));
       }
   })
})

上面的计算存在一个问题,如果一行数据里有多个工资项有计算公式,其中一个计算公式里的某一项依赖于另一个计算公式的结果,但是被依赖的工资项是后计算的,此时就计算错误了。
比如实发工资依赖于应发工资,而应发工资也是需要计算的,如果先计算应发工资后计算实发工资,这样没有问题,但如果先计算实发工资,这样就会得到错误的结果。

所以,我们需要针对计算公式增加一个计算排序字段,排序由用户自定义,然后根据排序先后来进行计算。

你可能感兴趣的:(web前端,JavaScript,正则表达式,javascript)