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

为何JavaScript forEach中的if语句未按预期排除迷宫起点终点?

问题:递归除法构建迷宫时,起点与终点被错误加入外墙节点列表

你在构建迷宫外墙时,希望排除起点和终点,但代码执行后这两个节点还是被加入了wallNodes,问题出在逻辑运算符的误用。

错误原因分析

你写的判断条件:

if (!node.isStart || !node.isFinish)

这个逻辑的意思是:只要节点不是起点,或者不是终点,就进入后续判断。

  • 对于起点节点:!node.isStart是false,但!node.isFinish是true,逻辑或||只要有一个为真就成立,所以会进入后续的外墙判断。
  • 对于终点节点:!node.isFinish是false,但!node.isStart是true,同样满足逻辑或的条件,也会进入后续判断。

而你实际需要的逻辑是:节点既不是起点,也不是终点,这时候应该用逻辑与&&:

if (!node.isStart && !node.isFinish)

修正后的代码

function createOuterWalls() {
  const wallNodes = [];
  const grid = [{isStart: true, isFinish: false, row: 0, col: 0},
                    {isStart: false, isFinish: false, row: 0, col: 1},
                    {isStart: false, isFinish: false, row: 0, col: 2},
                    {isStart: false, isFinish: false, row: 1, col: 0},
                    {isStart: false, isFinish: false, row: 1, col: 1},
                    {isStart: false, isFinish: false, row: 2, col: 0},
                    {isStart: false, isFinish: false, row: 2, col: 1},
                    {isStart: false, isFinish: true, row: 2, col: 2}]

  grid.forEach((node) => {
    // 修正逻辑运算符为 &&,仅处理既非起点也非终点的节点
    if (!node.isStart && !node.isFinish) {
      const { row, col } = node;
      if (
        row === 0 ||
        col === 0 ||
        row === 2 ||
        col === 2
      ) 
        wallNodes.push(node);    
    }
  })
  console.log(wallNodes);
}

修正后的执行结果

此时wallNodes会正确排除起点和终点,仅包含符合条件的外墙节点:

wallNodes = [
  {isStart: false, isFinish: false, row: 0, col: 1},
  {isStart: false, isFinish: false, row: 0, col: 2},
  {isStart: false, isFinish: false, row: 1, col: 0},
  {isStart: false, isFinish: false, row: 2, col: 0},
  {isStart: false, isFinish: false, row: 2, col: 1}
]

内容的提问来源于stack exchange,提问作者Bruno Oliveira

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 05:43:37