两个递归函数之间的区别

时间:2013-11-19 22:36:41

标签: javascript

findElementById

function findElementRecursion (inputId, currentElement) {
    if (currentElement.id == inputId) {
        return true;
    }
    var numChildren = currentElement.children.length;
    if (numChildren > 0) {
        for (i=0; i<numChildren; i++) {
            var currentChild = currentElement.children[i];
            console.log(currentChild);
            return findElementRecursion(inputId, currentChild);
        }
    }   
    return false;
}

有人会帮我调试这个递归函数吗? 它返回true时返回false。由于我没有看到任何错误消息,因此我很难弄清楚问题是什么。如果有人告诉我调试此类问题的步骤会很有帮助。

更新 问题是我在检查currentElement的第一个子节点后才返回。我修复了这个问题,但是当它应该返回true时,函数仍然返回false。

function findElementRecursion (inputId, currentElement) {
    if (currentElement.id == inputId) {
        return true;
    }
    var numChildren = currentElement.children.length;
    if (numChildren > 0) {
        for (i=0; i<numChildren; i++) {
            var currentChild = currentElement.children[i];
            if (findElementRecursion(inputId, currentChild)) {
                return true;
            }
        }
    }   
    return false;
}

使用findElementRecursion (主栏, document)在此页面的控制台中试用此功能,您会看到false

5 个答案:

答案 0 :(得分:2)

function findElementRecursion (inputId, currentElement) {
    var result = false;
    if (currentElement.id == inputId) {
        return true;
    }
    for (var i=0; i<currentElement.children.length; i++) {
        var currentChild = currentElement.children[i];
        console.log(currentChild);
        result = findElementRecursion(inputId, currentChild);

        // we can break here
        if(result)
             return true;
    }
    return false;
}

答案 1 :(得分:1)

如果我要这样做,我不会使用递归函数,我只使用 getElementsByTagName 。它会更快并以相同的顺序遍历元素。它也只会访问元素,而其他方法也可以访问文本节点。

function findElementById(id, root) {
  root = root || document;
  var elements = root.getElementsByTagName('*');

  for (var i=0, iLen=elements.length; i<iLen; i++) {

    if (elements[i].id == id) {
      return elements[i];
    }
  }
}

但也许你只想要一个递归函数来练习。

function findElementByIdRecursive(id, element) {

  // If no element passed in, use document
  element = element || document;

  // If element has id, return it
  if (element.id == id) return element;

  // Otherwise, keep going
  var foundElement;
  var childNodes = element.childNodes;

  // Not needed on modern browsers but older browsers may throw an error
  // if the node can't have children (like a text node)
  if (childNodes) {

    // Only keep looping while a matching element isn't found    
    for (var i=0,iLen=childNodes.length; i<iLen  && !foundElement; i++) {

      // Save a call if this node matches    
      if (childNodes[i].id == id) {
        return childNodes[i];
      }

      // Otherwise, go down its children
      foundElement = findElementByIdRecursive(id, childNodes[i]);
    }
    return foundElement;
  }
}

答案 2 :(得分:0)

你早点打破了循环:

    function findElementRecursion (inputId, currentElement) {
        var result = false;
        if (currentElement.id == inputId) {
            return true;
        }
        var numChildren = currentElement.children.length;
        if (numChildren > 0) {
            for (i=0; i<numChildren; i++) {
                var currentChild = currentElement.children[i];
                console.log(currentChild);
                result = findElementRecursion(inputId, currentChild);
                if(result){
                   break;
                   }
            }
        }   
        return result;
    }

答案 3 :(得分:0)

可能有更好的方法来实现这一点 - 比如使用jQuery - 但这应该有效:

function findElementRecursion (inputId, currentElement) {
  if (currentElement.id == inputId) {
    return true;
  }

  if (!currentElement.children) return false;
  var numChildren = currentElement.children.length;
  if (numChildren > 0) {
    for (var i in currentElement.children) {
      var currentChild = currentElement.children[i];
      console.log(currentChild);
      if (findElementRecursion(inputId, currentChild)) return true;
    }
  }   
return false;
}

请注意,您还必须检查该元素是否实际具有子级

答案 4 :(得分:0)

从初始代码

开始
function findElementRecursion (inputId, currentElement) {
    if (currentElement.id == inputId) {
        return true;
    }
    var numChildren = currentElement.children.length;
    if (numChildren > 0) {
        for (i=0; i<numChildren; i++) {
            var currentChild = currentElement.children[i];
            console.log(currentChild);
            return findElementRecursion(inputId, currentChild);
        }
    }   
    return false;
}

问题是我只是在检查每个currentElement的第一个元素后过早地返回并退出循环。

function findElementRecursion (inputId, currentElement) {
    if (currentElement.id == inputId) {
        return true;
    }
    var numChildren = currentElement.children.length;
    if (numChildren > 0) {
        for (i=0; i<numChildren; i++) {
            var currentChild = currentElement.children[i];
            console.log(currentChild);
            if (findElementRecursion(inputId, currentChild)) return true;
        }
    }   
    return false;
}

但是,当函数返回true时,该函数仍然返回false。那是因为我没有将i设置为局部变量。它应该是var i,因此它包含在每个本地环境中。

function findElementRecursion (inputId, currentElement) {
    if (currentElement.id == inputId) {
        return true;
    }
    var numChildren = currentElement.children.length;
    if (numChildren > 0) {
        for (var i=0; i<numChildren; i++) {
            var currentChild = currentElement.children[i];
            console.log(currentChild);
            if (findElementRecursion(inputId, currentChild)) return true;
        }
    }   
    return false;
}

一切都很好!