如何实现支持+、-、*的顺序运算解释器并适配多维数组传参?
实现简单运算解释器并处理多维数组传参问题
需求回顾
咱们要做的是一个简单的运算解释器,规则很明确:
- 只支持
+、-、*三种运算 - 从给定的初始值开始,严格按顺序执行每一组运算符和参数,完全不管运算优先级(直接忽略B.O.D.M.A.S规则)
- 只要碰到不认识的命令,直接返回
-1
看几个示例更清楚:
interpret(1, ["+"], [1]) → 2 interpret(4, ["-"], [2]) → 2 interpret(1, ["+", "*"], [1, 3]) → 6 // 先算1+1=2,再算2*3=6 interpret(5, ["+", "*", "-"], [4, 1, 3]) → 6 // 一步步算:5+4=9 → 9*1=9 → 9-3=6
你的问题分析
你尝试把初始值、运算符数组、参数数组打包成一个多维数组newArray = [integer, operator, intArr]来传参,但不知道怎么让这个结构配合解释器完成顺序运算。其实核心就是先把这个多维数组里的三个部分拆出来,再传给能处理运算的核心函数就行。
解决方案
1. 先写核心的解释器函数
首先咱们得有一个能处理运算逻辑的函数,它接收初始值、运算符数组、参数数组这三个参数,然后按顺序执行运算:
function interpret(initialValue, operators, operands) { // 先校验:运算符和参数的数量得对应上,不然没法正常运算 if (operators.length !== operands.length) { console.error("运算符和参数数量不匹配哦"); return -1; } let result = initialValue; // 遍历每一组运算符和参数,依次计算 for (let i = 0; i < operators.length; i++) { const currentOp = operators[i]; const currentNum = operands[i]; switch(currentOp) { case "+": result += currentNum; break; case "-": result -= currentNum; break; case "*": result *= currentNum; break; default: // 碰到未知运算符,直接返回-1 return -1; } } return result; }
2. 处理多维数组传参
针对你定义的多维数组,咱们只需要用解构语法把里面的三个元素拆出来,再传给上面的interpret函数就搞定了:
let operator = ["+", "-"]; let integer = 1; let intArr = [1, 2]; let newArray = [integer, operator, intArr]; // 从多维数组里解构出初始值、运算符数组、参数数组 const [initialVal, opsList, numsList] = newArray; // 调用解释器函数得到结果 const finalResult = interpret(initialVal, opsList, numsList); console.log(finalResult); // 计算过程:1+1=2 → 2-2=0,输出0
或者更简洁一点,用扩展运算符直接把多维数组的元素传给函数:
const finalResult = interpret(...newArray);
3. 边界情况测试
咱们再验证几个特殊场景,确保符合需求:
// 测试未知运算符的情况 const testUnknownOp = [2, ["/"], [1]]; console.log(interpret(...testUnknownOp)); // 输出-1 // 测试运算符和参数数量不匹配的情况 const testMismatch = [3, ["+", "-"], [5]]; console.log(interpret(...testMismatch)); // 输出-1(控制台会提示数量不匹配)
内容的提问来源于stack exchange,提问作者diagold
相关产品推荐
相关产品推荐

