如何在JavaScript中解析含数组的任意数学表达式并执行逐元素运算
向量逐元素公式运算实现方案
你可以不用手动实现复杂的公式语法解析,利用「逐索引替换占位符后算标量结果再聚合」的思路,就能低成本实现需求,完整可运行代码如下:
// 输入数据 const formula = "{{a45bc2a1-ed82-4ccd-a455-f7959e875aad}}+({{f6c2ef2b-a4fa-4cfb-b62d-d0d7c3e266d9}}*{{335563ad-a715-47b9-8e54-2b8553768168}})" const map = { "a45bc2a1-ed82-4ccd-a455-f7959e875aad": [1, 2, 3, 4, 5], "f6c2ef2b-a4fa-4cfb-b62d-d0d7c3e266d9": [10, 20, 30, 40, 50], "335563ad-a715-47b9-8e54-2b8553768168": [1, 2, 3, 4, 5] } function calculateVectorFormula(formula, map) { // 校验所有映射数组长度一致 const lengths = Object.values(map).map(arr => arr.length) if (!lengths.every(len => len === lengths[0])) { throw new Error('所有映射的数组长度必须一致') } const vectorLength = lengths[0] const result = [] // 遍历每个索引位置计算 for (let i = 0; i < vectorLength; i++) { // 替换当前索引的所有占位符为具体数值 const currentFormula = formula.replace(/{{([^}]+)}}/g, (match, uuid) => { if (!map[uuid]) throw new Error(`未找到id ${uuid} 的映射值`) return map[uuid][i] }) // 计算当前位置的标量结果 result.push(eval(currentFormula)) } return result } // 运行测试 console.log(calculateVectorFormula(formula, map)) // 输出 [11, 42, 93, 164, 255]
注意事项
- 如果公式是外部用户输入的场景,为了避免
eval的注入风险,可以替换为math.js的evaluate方法执行公式,安全性更高。 - 该方案天然支持加减乘除、幂、开方、括号等所有JS原生支持的数学运算,不需要额外做语法适配。
内容的提问来源于stack exchange,提问作者eakl
相关产品推荐
相关产品推荐

