You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 07:15:03