【问题标题】:JavaScript + recursive function returning undefinedJavaScript + 递归函数返回未定义
【发布时间】:2012-05-25 23:08:52
【问题描述】:

我有一个需要遍历的简单 html 结构。出于某种原因,我的递归函数在任何嵌套节点上返回“未定义”,但对父节点不返回。不幸的是,这需要是本机 js,没有 jQuery。谢谢!

HTML:

<div id="container">
  <div id="head"> 
    <span id="left"><</span> 
    <span id="right">></span> 
  </div>
</div>

脚本:

var h = hasId(container, 'head');
var l = hasId(container, 'left');
var r = hasId(container, 'right');

console.log(h + " : " + r + " : " + l);
//[object HTMLDivElement] : undefined : undefined

function hasId(ele, id) {
    for (var i = 0; i < ele.childNodes.length; i++) {
        var child = ele.childNodes[i];
        if(child.id == id) return child;
        else hasId(child, id);
    }
}

【问题讨论】:

标签: javascript recursion


【解决方案1】:

您只是在递归调用中对return 的调用。此外,您应该测试其结果是否已定义。如果是,则可以返回,否则继续循环。

var h = hasId(container, 'head');
var l = hasId(container, 'left');
var r = hasId(container, 'right');

console.log(h + " : " + r + " : " + l);
//[object HTMLDivElement] : undefined : undefined

function hasId(ele, id) {
    for (var i = 0; i < ele.childNodes.length; i++) {
        var child = ele.childNodes[i];
        if(child.id == id) return child;
        else {
          var next = hasId(child, id);
          if(next) return next;
        };
    }
}​

【讨论】:

  • 您的代码是正确的,但您修复了一个更微妙的错误,但没有解释原因。正如我最初回答的那样,这不是只是缺少return,而是在递归结果本身定义的情况下才会发生此返回。
  • 不客气 =) 在递归调用中,如果结果未定义,则循环应继续。所以直接退回是行不通的。
  • 谢谢!!!工作得很好......一旦我阅读了这个例子就很有意义,非常感谢。
【解决方案2】:

else 子句应该 returnhasId(child, id) 的值,但前提是该值本身已定义,否则它必须继续循环。

如果没有return,函数将递归,但不会给出答案。

【讨论】:

  • 只输入else return hasId(...) 是行不通的。皮埃尔的答案,检查答案是否已定义,是正确的。
  • @PaulPhillips 我刚才也发现了这一点,但即使皮埃尔的回答也不完整——它永远不会正确展开递归。
  • @PaulPhillips 啊,不,皮埃尔的回答似乎解决了这个问题。
  • 哈,我真的没读过。在@worked 给出的测试输入上,它成功了:jsfiddle
【解决方案3】:

你可以这样修复它:

var h = hasId(container, 'head');
var l = hasId(container, 'left');
var r = hasId(container, 'right');

console.log(h + " : " + r + " : " + l);

function hasId(ele, id) {
    for (var i = 0; i < ele.childNodes.length; i++) {
        var child = ele.childNodes[i];
        if(child.id == id || (child = hasId(child, id))){
           return child;
        }
    }
    return false;
}

【讨论】:

  • 这不起作用。如果循环调用没有返回任何元素,当需要继续遍历元素时,您的函数仍会返回。
猜你喜欢
  • 2017-01-21
  • 1970-01-01
  • 2012-09-26
相关资源
最近更新 更多