【问题标题】:Skipping do/while loop跳过 do/while 循环
【发布时间】:2018-01-08 15:27:37
【问题描述】:

大家好,我正在编写一个算法来从 NodeTree 中删除具体的分支(比如 DSF)。如果您选择节点的名称,算法将检查该节点是否是另一个节点的父节点;如果是,则需要该节点的子节点并添加到堆栈等。希望代码能够呈现这一点。

问题是循环 do/while 被执行了两次,而我认为它应该执行一次。 while 内部发生了 null 条件,因为它被跳过了。

  stack.push(keys.head);
    // visited.push(flag.data);
    while(stack.size>0){
        stackTemp=stack.get()

        stack.pop();
        do{
          values=stackTemp.next;
          stack.push(values);
          stackTemp=values.next;
          stack.show();

        }while (!stackTemp)
        stackTemp=stack.get()
        // console.log(stackTemp);
        keyTemp=this.map.get(stackTemp.data);
        if(keyTemp=undefined)
        stack.pop();

      }

我还检查了“stackTemp!==”。有任何想法吗?如果有不清楚的地方,对不起,我会尽力解释。 问候!

【问题讨论】:

  • 使用while循环而不是do…while?
  • 你可以随时使用return来破解它
  • @Lissy 我会为此使用break;,因为如果在函数内部,return 将退出整个函数而不仅仅是循环
  • 我正在做类似的事情,我正在使用break,但我认为由于while内部的条件没有意义,为什么这个条件不起作用,如果stacktemp有null为什么这个循环仍然继续直到出错?
  • while(stackTemp = stackTemp.next) stack.push(stackTemp) ..?你肯定想要while(stackTemp),而不是相反。

标签: javascript node.js loops null do-while


【解决方案1】:

看来cmets还不足以让你挡道,那我再补充说明,再加上我自己的:

_Bergi 建议您使用 while 的另一种语法,原因是:do{ /*code*/ }while(condition) 将至少执行一次代码,无论条件如何。您可能想使用while(condition){ /*code*/ },因为使用此语法,如果条件失败,您将不会进入循环,并且您的条件是“如果存在 var 值”,那么如果失败,您就不想进入。

_在另一件事中我不会解释(因为我想尽可能保持清晰,这是一个更高级的功能),Jonas W. 评论说你的情况是错误的。 while 的意思是“只要”。您的代码告诉“只要stackTemp 为假(或为空、未定义等),就留在循环中”。你可能想要相反的结果。

_最后,把stackTemp.next存入values放到数组里也没用。如果它是一个对象(或函数),则不会复制它的值,因为 JS 通过引用传递它们。可以直接将stackTemp.next存入数组,也是一样的,因为stackTemp被替换后,它的引用改变了,数组中存储的stackTemp.next不受影响。

如果它仍然不起作用,这将是来自其他东西的结果:

stack.push(keys.head);
// visited.push(flag.data);
while(stack.size>0){
    stackTemp=stack.get()

    stack.pop();
    while (stackTemp){ //not supposed to enter here is stackTemp is empty
      stack.push(stackTemp.next);
      stackTemp=stackTemp.next; //stackTemp reference is replaced
      stack.show();
    }
    stackTemp=stack.get()
    // console.log(stackTemp);
    keyTemp=this.map.get(stackTemp.data);
    if(keyTemp=undefined)
    stack.pop();

}

【讨论】:

  • 呃,对不起,伙计们,我好像有点累了,不敢相信我看不到,是的,它从循环中退出了,并且在所有循环再次重复之后,在第二次尝试它抛出错误消息,很抱歉浪费时间这么简单的问题,谢谢!
  • 没问题,很高兴我们能为您提供帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-23
  • 1970-01-01
  • 2013-06-05
  • 2017-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多