JavaScript中如何统一判断目标达成而非在每个移动函数中重复编写if/else?
这问题我太懂了!重复在每个移动函数里写相同的目标判断代码,不仅显得冗余,后续要修改逻辑(比如改成弹窗提示而不是console.log)也得改四次,太麻烦了。咱们可以用几种简洁的方式来统一处理这个检查逻辑:
方法1:封装独立的目标检查函数
把重复的if判断抽成一个单独的函数,每次移动完成后调用它就行。这样既避免重复,还能统一维护检查逻辑。
// 单独封装目标检查函数 function checkGoalStatus() { if (agentPos[0] === goalPos[0] && agentPos[1] === goalPos[1]) { console.log('goal reached'); // 这里还可以扩展逻辑,比如触发胜利音效、停止移动操作等 } } // 改造后的移动函数 function moveUp() { // 先处理移动逻辑,注意要防止移出4x4网格边界 agentPos[0] = Math.max(0, agentPos[0] - 1); // 移动后统一检查是否到达目标 checkGoalStatus(); } function moveDown() { agentPos[0] = Math.min(3, agentPos[0] + 1); checkGoalStatus(); } function moveLeft() { agentPos[1] = Math.max(0, agentPos[1] - 1); checkGoalStatus(); } function moveRight() { agentPos[1] = Math.min(3, agentPos[1] + 1); checkGoalStatus(); }
如果你的agentPos和goalPos是局部变量(不是全局的),那可以给检查函数传参:
function checkGoalStatus(agent, goal) { if (agent[0] === goal[0] && agent[1] === goal[1]) { console.log('goal reached'); } } // 移动函数里调用时传参 function moveUp() { agentPos[0] = Math.max(0, agentPos[0] - 1); checkGoalStatus(agentPos, goalPos); }
方法2:用通用移动函数统一所有逻辑
更彻底的方式是把四个移动函数合并成一个通用函数,通过参数控制方向,这样连移动逻辑都不用重复写,检查逻辑自然也只需要写一次:
function move(direction) { // 根据方向处理移动 switch(direction) { case 'up': agentPos[0] = Math.max(0, agentPos[0] - 1); break; case 'down': agentPos[0] = Math.min(3, agentPos[0] + 1); break; case 'left': agentPos[1] = Math.max(0, agentPos[1] - 1); break; case 'right': agentPos[1] = Math.min(3, agentPos[1] + 1); break; default: console.log('无效的移动方向'); return; // 方向不对直接退出,不执行检查 } // 移动完成后统一检查目标 checkGoalStatus(); } // 调用方式:move('up')、move('down')、move('left')、move('right')
为什么你之前抽离后可能失效?
大概率是作用域问题:如果你的agentPos和goalPos是某个函数内部的局部变量,抽离后的检查函数访问不到它们,自然不会触发判断。这时候给检查函数传参就能解决,就像上面方法1里的传参版本那样。
这样处理后,不仅代码更简洁,后续要修改目标判断逻辑(比如改成判断是否满足其他条件,或者修改提示内容),只需要改checkGoalStatus这一个函数就够了!
内容的提问来源于stack exchange,提问作者sadmansh
相关产品推荐
相关产品推荐

