为何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
相关产品推荐
相关产品推荐

