JavaScript - 递归查找父节点

标签 javascript jquery

我有一个用 JavaScript 编写的应用程序。在这个应用程序中,我有一棵 JavaScript 对象树。示例树和下面的代码可以在这个 JSFiddle 中看到.

我正在尝试编写一个函数,该函数将返回作为祖先的 ID 列表。具有特定 ID 的元素的祖先。目前,我有以下内容:

function getAncestors(childId, branch) {
  var ancestors = [];
  for (var i = 0; i < branch.length; i++) {
    for (var j = 0; j < branch[i].children.length; j++) {
      if (branch[i].children[j].id === childId) {
        ancestors.push(branch[i].id);
        return ancestors;
      } else {
        var _ancestors = getAncestors(childId, branch[i].children);
        for (var k = 0; k < _ancestors.length; k++) {
          if (ancestors.indexOf(_ancestors[k]) === -1) {
            ancestors.push(_ancestors[k]);
          }
        }
      }
    }
  }
  return ancestors;
}

它总是返回第一个父级。但是,它不会返回所有祖先。例如,在 JSFiddle ,我正在尝试获取一个包含以下内容的数组:[201, 2],按该顺序排列。我不确定我做错了什么。我一直盯着这个,它看起来是正确的。但是,很明显,它不起作用。

最佳答案

这是工作代码(使用迭代):

function getAncestors(childId, newbranch) {
    for (var i = 0; i < newbranch.length; i++) { // Search all branches
        var branch = newbranch[i];

        if (branch.id === childId) {
            return [];
        } else {
            if (branch.children && branch.children.length) {
                var x;

                if ((x = getAncestors(childId, branch.children)) !== false) {
                    x.push(branch.id)
                    return x;
                }
            }
        }
    }

    return false;
}

结果:

[201,2]

编辑(更短)

function getAncestors(childId, branch) {
    var i, ancestors;

    for (i = 0; !ancestors && branch && i < branch.length; i++) {
        if (branch[i].id === childId) return [];
        ancestors = getAncestors(childId, branch[i].children);
        if (ancestors) ancestors.push(branch[i].id);
    }
    return ancestors;
}

关于JavaScript - 递归查找父节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40722902/

相关文章:

javascript - jquery .val() 下拉菜单上的奇怪行为

jquery - jQuery Word 在文本中替换的动画

javascript - JS 正则表达式 : How to capture repeating pattern into different array elements?

javascript - Koa路由器: How to get query string params?

javascript - Chrome 通过 jquery 清空我的列表框真的很慢

javascript - Next.js 中的 Trustpilot TrustBox

javascript - 具有 sleep /超时功能的 jQuery 请求循环

jquery - 如何使用 jQuery 将超链接文本用作变量?

jquery - 如何在服务器端修改 CORS 请求(来自 IE8 或 IE9) - 以启用 Spring 绑定(bind)

javascript - FileZilla/FTP 服务器上的 JSON 文件无法正确读取