JavaScript如何解析自然语言指令识别运算符并执行加法运算
问题描述
我正在尝试通过人类自然语言实现加法运算。我的代码接收输入后,将每个词汇拆分并推入名为dl的数组中,该功能运行无异常,执行console.log打印时输出如下:
[ 'add' ] [ 'add', '6' ] [ 'add', '6', 'and' ] [ 'add', '6', 'and', '4' ]
目前我在代码中定义了一个用作“运算符”的数组,内容如下:
var operator = [ "add", "sub", "mul", "div" ]
我希望遍历dl数组,检测其中是否包含运算符数组内的元素;若检测结果为真,则对6和4执行加法运算,使代码最终输出计算结果10。
当前完整代码如下:
function output(func) { console.log(func) } var operator = [ "add", "sub", "mul", "div" ] var dl = [] const read = string => { return string.split(' ').map(item => { dl.push(item.trim()) console.log(dl) }) } var main = read( `add 6 and 4` ) output(main)
解决方案
原代码存在两个核心问题:
read方法中使用map做数组推入操作但没有返回有效值,最终main变量拿到的是全为undefined的数组- 词汇拆分完成后没有实现运算符识别、数字提取、运算执行的逻辑
修正后的可运行代码如下:
function output(res) { console.log(res) } const operator = [ "add", "sub", "mul", "div" ] // 运算符与计算逻辑映射 const calcMap = { add: (a, b) => a + b, sub: (a, b) => a - b, mul: (a, b) => a * b, div: (a, b) => a / b } const dl = [] const read = string => { // 拆分词汇存入dl数组 string.split(' ').forEach(item => { dl.push(item.trim()) }) // 识别有效运算符 const currentOp = dl.find(item => operator.includes(item)) if (!currentOp) return new Error('未识别到有效运算符') // 提取所有有效数字 const nums = dl.filter(item => !isNaN(Number(item))).map(Number) if (nums.length < 2) return new Error('未识别到足够的运算数值') // 执行对应运算返回结果 return calcMap[currentOp](nums[0], nums[1]) } const main = read(`add 6 and 4`) output(main) // 最终输出10
代码逻辑说明:
- 用
forEach替代原有的map完成词汇推入操作,避免生成无意义的undefined数组 - 新增运算映射表,将运算符字符串和实际计算逻辑绑定,后续扩展运算规则只需要修改对应配置即可
- 词汇拆分完成后先匹配有效运算符,再过滤提取所有数字项并转为数值类型
- 校验运算符和运算数有效性后执行计算,输入
add 6 and 4时会正确输出结果10,替换为其他运算符(如sub 6 and 4)也能返回正确计算结果
内容的提问来源于stack exchange,提问作者1BL1ZZARD
相关产品推荐
相关产品推荐

