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

JavaScript函数开发:基于Data与Calculations数组生成计算表达式数组

开发JavaScript计算表达式生成函数

需求说明

需要实现一个函数,基于以下两个输入数组生成计算表达式字符串数组:

  • Data数组:存储原始数据元素,每个元素包含id、name、value字段
  • Calculations数组:每个元素通过calc子数组定义计算规则,calc中的每一项分为三种类型:
    • type: "field":引用Data数组中对应id的元素的value值
    • type: "operator":直接使用该项的value作为运算符
    • type: "calc":引用Calculations数组中对应id的元素生成的表达式,且该表达式需要用括号包裹

函数最终返回一个新数组,结构与示例中的mynewarray一致,每个元素包含id和对应的计算表达式字符串。

示例输入数据

const data = [
  { id: 1, name: "item 1", value: 2 },
  { id: 2, name: "item 2", value: 3 },
  { id: 3, name: "item 3", value: 4 },
  { id: 4, name: "item 4", value: 5 },
  { id: 5, name: "item 5", value: 6 },
];

const calculations = [
  {
    id: 1,
    name: "cal 1",
    calc: [
      { id: 1, type: "field", value: 1 },
      { id: 2, type: "operator", value: "+" },
      { id: 3, type: "field", value: 3 },
    ],
  },
  {
    id: 2,
    name: "cal 2",
    calc: [
      { id: 1, type: "calc", value: 1 },
      { id: 2, type: "operator", value: "+" },
      { id: 3, type: "field", value: 4 },
    ],
  },
  {
    id: 3,
    name: "cal 3",
    calc: [
      { id: 1, type: "field", value: 3 },
      { id: 2, type: "operator", value: "+" },
      { id: 3, type: "calc", value: 1 },
      { id: 4, type: "operator", value: "*" },
      { id: 5, type: "calc", value: 2 },
    ],
  },
  {
    id: 4,
    name: "cal 4",
    calc: [
      { id: 1, type: "calc", value: 3 },
      { id: 2, type: "operator", value: "*" },
      { id: 3, type: "calc", value: 2 },
    ],
  },
];

预期输出数组

const mynewarray = [
  { id: 1, value: "2+4"},
  { id: 2, value: "(2+4)+5"},
  { id: 3, value: "4+(2+4)*((2+4)+5)" },
  { id: 4, value: "(4+(2+4)*((2+4)+5))*((2+4)+5)"}
];

实现代码

function generateCalculationExpressions(data, calculations) {
  // 缓存已生成的表达式,避免重复计算
  const calcCache = new Map();
  // 快速查找Data元素的Map
  const dataMap = new Map(data.map(item => [item.id, item.value]));
  // 快速查找Calculations元素的Map
  const calcMap = new Map(calculations.map(item => [item.id, item.calc]));

  // 递归生成单个计算项的表达式
  function generateExpr(calcId) {
    if (calcCache.has(calcId)) {
      return calcCache.get(calcId);
    }
    const calcItems = calcMap.get(calcId);
    let expr = '';
    for (const item of calcItems) {
      switch (item.type) {
        case 'field':
          expr += dataMap.get(item.value);
          break;
        case 'operator':
          expr += item.value;
          break;
        case 'calc':
          // 引用其他计算项时包裹括号
          expr += `(${generateExpr(item.value)})`;
          break;
      }
    }
    calcCache.set(calcId, expr);
    return expr;
  }

  // 遍历所有Calculations生成结果数组
  return calculations.map(calc => ({
    id: calc.id,
    value: generateExpr(calc.id)
  }));
}

验证代码

// 调用函数
const result = generateCalculationExpressions(data, calculations);
// 打印结果对比
console.log(result);
// 输出与mynewarray一致

内容的提问来源于stack exchange,提问作者gangata arun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 04:47:17