如何在TypeScript/Angular中基于数组内容计算数学表达式结果
实现方案
步骤1:定义TS基础类型
先匹配你的数组结构定义类型,同时提前声明支持的运算符映射:
type FormulaItemType = 'Number' | 'Operator'; interface FormulaItem { id: number; type: FormulaItemType; value: string; } // 支持的加减乘除运算映射,可根据需求扩展运算符 const operatorMap: Record<string, (a: number, b: number) => number> = { '+': (a, b) => a + b, '-': (a, b) => a - b, '*': (a, b) => a * b, '/': (a, b) => { if (b === 0) throw new Error('除数不能为0'); return a / b; } };
步骤2:实现核心计算函数
function calculateFormula(formula: FormulaItem[]): number { // 基础格式校验 if (formula.length % 2 === 0) throw new Error('公式数组长度应为奇数,格式为数字-运算符-数字交替'); if (formula[0].type !== 'Number') throw new Error('公式第一项必须为数字类型'); let result = Number(formula[0].value); if (isNaN(result)) throw new Error(`首项无效数字:${formula[0].value}`); // 步长为2遍历,每次取运算符+下一个数字计算 for (let i = 1; i < formula.length; i += 2) { const operator = formula[i]; const nextNumItem = formula[i + 1]; if (operator.type !== 'Operator' || nextNumItem?.type !== 'Number') { throw new Error('公式格式错误,需按数字-运算符-数字顺序排列'); } const calcFn = operatorMap[operator.value]; if (!calcFn) throw new Error(`不支持的运算符:${operator.value}`); const nextNum = Number(nextNumItem.value); if (isNaN(nextNum)) throw new Error(`无效数字:${nextNumItem.value}`); result = calcFn(result, nextNum); } return result; }
步骤3:调用测试
const arrayFormula: FormulaItem[] = [ {id:1, type:'Number', value: '5'}, {id:1, type:'Operator', value: '+'}, {id:1, type:'Number', value: '2'} ]; try { const total = calculateFormula(arrayFormula); console.log(total); // 输出结果为7,符合预期 } catch (e) { console.error('计算失败:', (e as Error).message); }
Angular环境使用说明
可以将上述逻辑封装为全局服务,方便全项目调用:
// formula-calculate.service.ts import { Injectable } from '@angular/core'; @Injectable({ providedIn: 'root' }) export class FormulaCalculateService { private operatorMap: Record<string, (a: number, b: number) => number> = { // 运算符映射同上 }; calculate(formula: FormulaItem[]): number { // 计算逻辑同上 } }
组件内直接注入该服务调用calculate方法即可。
补充说明
当前实现是按从左到右的顺序计算,没有处理运算符优先级,如果需要支持乘除优先的运算规则,可以基于栈结构对公式数组做优先级拆分后再计算。
内容的提问来源于stack exchange,提问作者Purushothaman c
相关产品推荐
相关产品推荐

