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

2023-10-31

背景

最近在做一个工资系统,有的工资项可以根据用户自定义的公式来自动计算,类似于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));
       }
   })
})

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Javascript 实现类似 Excel 的公式解析计算功能 的相关文章

  • 需要帮助从数组中为国家/地区着色,保留其余默认颜色

    我需要一些帮助从我创建的数组中获取数据 然后仅对数组中存在的国家 地区进行着色 而不在数组中的其余国家 地区我希望保留为默认颜色 我正在使用 D3 来完成所有这些工作 并且我非常确定我可以通过 D3 实现我需要的目标 但不确定如何实现 我想
  • 当条件满足时如何打破CasperJS的重复功能?

    我想知道是否可以打破 casper repeat 循环 我有这个脚本可以做到这一点 在谷歌上搜索特工001 特工002 特工003 特工004 特工005 特工006 直到特工011 我希望它在找到文本 詹姆斯 邦德 后停止循环 现在它找到
  • 如何在phonegap应用程序中使用存储在localStorage中的json feed?

    这就是我正在做的 向我的网络服务器发出请求 响应采用 json 格式 使用 jquery 模板在我的应用程序中呈现回调数据 非常简单 就像魅力一样 问题是 我想在本地存储一些数据 这样我的应用程序就不必每次都从服务器获取它 3g 很慢 每笔
  • javascript中怪异模式的元素宽度?

    我一直在浏览所有流行的 js 库 但我找不到一个具有 DOM 元素宽度函数的库 该函数实际上可以解释 Internet Explorer 中的怪异模式 问题是 当启用怪异模式时 填充和边框不会计入宽度 据我所知 当省略 doctype 或将
  • 用不同的颜色为 Google 热图着色

    我试图开发一个遵循 Google Map API 的热度 https developers google com maps documentation javascript examples layer heatmap https deve
  • 具有两组子组件的 React 组件

    我正在创建一个组件 需要接收两组子组件并放置在组件的两个不同部分中 let CreditCardForm icons fields gt div div div div icons div div div fields div let Cr
  • Angular.js:未捕获的错误,没有模块:myapp

    我也在尝试引导 angular js 项目 这是我的index html div p Loading p div
  • 在 javascript 中访问 ajax POST 响应

    我正在从 javascript 函数发出 ajax POST 请求 function UpdateMetrics ajax type POST url MyHandler ashx Param1 value1 data contentTyp
  • 使用JQuery检查元素是否有边框?

    所以我正在玩 el css 尝试确定元素是否有边框 我用 css border style solid 设置边框 这是可行的 但实际上它设置了 4 种单独的样式 border right style border left style bo
  • Child_process 处理带有回车符 (\r) 的 STDOUT 流

    我正在编写一个简单的应用程序 它允许工作中的内部系统请求从远程服务器到使用 REST 调用发起的另一个远程服务器的复制过程 使用 rsync 我已经对express框架足够熟悉 并且刚刚开始尝试child process库 并偶然发现了一个
  • 如何获取传单标记簇中点击事件的图块?

    这是我的代码 function onMapClick e e originalEvent defaultPrevented true var orig e originalEvent console log orig target map
  • 使用 jquery 通配符检查 cookie 名称

    我有一个生成动态 cookie 的表单 例如 webform 62 1234356 62 1234356 可以是任意数字 我需要使用一些通配符检查来检查名称以 webform 开头的 cookie 是否存在 下面不起作用 if cookie
  • 嵌套辅助函数和性能

    嵌套辅助函数对于使代码更易于理解非常有用 谷歌甚至建议在他们的应用程序中使用嵌套函数时尚指南 https google styleguide googlecode com svn trunk javascriptguide xml Nest
  • Angular 2 runOutsideAngular 仍然改变 UI

    从我的理解来看runOutsideAngular https angular io docs ts latest api core index NgZone class html runOutsideAngular anchor 如果我需要
  • Sequelize.js - “不关联到”

    我在从数据库获取完整数据时遇到一些问题 那是我的模型 User module exports function sequelize DataTypes return sequelize define user id type DataTyp
  • 如何检查 Map 或 Set 是否为空?

    对于 JavaScript 中的传统对象 使用以下命令很容易检查它是否为空 Object keys method const emptyObj console log Object keys emptyObj length 0 true i
  • 水平平滑滚动 100px

    Heyjo problem 一周以来我一直在寻找 javascript 或 jQuery 代码 以便在我的网站上实现滚动按钮 我失败的那一刻是按钮应该多次工作的时候 他的任务不是滚动到专用元素 而是应该向左滚动 例如 100px 此外 滚动
  • D3v6 嵌套图 - 嵌套 join()?

    我想可视化每个节点的 孩子 洞察力 我猜 D3v6 join 函数可以嵌套 不幸的是我找不到任何例子 下面的代码片段包含一个具有 3 个节点和子节点作为属性的outerGraph 到目前为止 这些孩子还没有被使用 相反 innerGraph
  • 一个接一个地淡入div

    大家好 我很擅长 HTML 和 CSS 但才刚刚开始接触 jQuery 的皮毛 我希望让 3 个 div 在页面加载时逐渐淡入 到目前为止我有这个 我听说使用 css 将显示设置为 none 对于任何使用非 JavaScript 浏览器的人
  • Jquery 两个字段的时间差(以小时为单位)

    我的表单中有两个字段 用户可以在其中选择输入时间 start time end time 我想在更改这些字段时重新计算另一个字段的值 我想做的是获取两次之间的小时数 例如 如果我的开始时间为 5 30 结束时间为 7 50 我想将结果 2

随机推荐