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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 05:18:02