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
相关产品推荐
相关产品推荐

