当前位置: 首页 > 知识库问答 >
问题:

javascript 树形结构数据,如何根据叶子节点的属性查询并返回所经路径的新树?

索寒
2023-05-26
// 测试数据
let data = [
  {
    type: "A",
    children: [
      {
        type: "B",
        children: [
          {
            type: "C",
            children: [],
          },
          {
            type: "D",
            children: [],
          },
        ],
      },
      {
        type: "C",
        children: [],
      },
      {
        type: "E",
        children: [],
      },
    ],
  },
  {
    type: "F",
    children: [
      {
        type: "C",
        children: [],
      },
      {
        type: "H",
        children: [],
      },
    ],
  },
  {
    type: "C",
    children: [],
  },
  {
    type: "C",
    children: [
      {
        type: "A",
        children: [],
      },
    ],
  },
];

期望结果:

// 查找type为C的子节点(children为空),结果应返回
[
  {
    type: "A",
    children: [
      {
        type: "B",
        children: [
          {
            type: "C",
            children: [],
          },
        ],
      },
      {
        type: "C",
        children: [],
      },
    ],
  },
  {
    type: "F",
    children: [
      {
        type: "C",
        children: [],
      },
    ],
  },
  {
    type: "C",
    children: [],
  },
];

补充

// 这种情况不返回,因为C不是叶子节点
[{
    type: "C",
    children: [
      {
        type: "A",
        children: [],
      },
    ],
  }]

结合边城用户的文章,最后得出的方法:

function findTreeNode(tree, predicate) {
  if (Array.isArray(tree)) {
    return filter(tree) ?? [];
  } else {
    tree.children = filter(tree.children);
    return tree;
  }

  function filter(nodes) {
    if (!nodes?.length) {
      return nodes;
    }

    return nodes.filter((it) => {
      // 先筛选子树,如果子树中没有符合条件的,children 会是 [] 或 undefined
      const children = filter(it.children);
      // 根据当前节点情况和子树筛选结果判断是否保留当前节点
      if ((predicate(it) && !it.children?.length) || children?.length) {
        // 如果要保留,children 应该用筛选出来的那个;不保留的话就不 care 子节点了
        it.children = children;
        return true;
      }
      return false;
    });
  }
}

let data = [
  {
    type: "A",
    children: [
      {
        type: "B",
        children: [
          {
            type: "C",
            children: [],
          },
          {
            type: "D",
            children: [],
          },
        ],
      },
      {
        type: "C",
        children: [],
      },
      {
        type: "E",
        children: [],
      },
    ],
  },
  {
    type: "F",
    children: [
      {
        type: "C",
        children: [],
      },
      {
        type: "H",
        children: [],
      },
    ],
  },
  {
    type: "C",
    children: [],
  },
  {
    type: "C",
    children: [
      {
        type: "A",
        children: [],
      },
    ],
  },
];

console.log(findTreeNode(data, (item) => item.type === "C"));

共有1个答案

丁景山
2023-05-26

看看这个行不

javascript - 过滤/筛选树节点 - 边城客栈 - SegmentFault 思否

 类似资料:
  • 我有一个树数据结构,其中每个节点可以有任意数量的子节点,树可以是任何高度的。获取树中所有叶节点的最佳方法是什么?有没有可能比遍历树中的每个路径更好,直到我到达叶节点? 在实践中,树的最大深度通常为 5 左右,树中的每个节点将有大约 10 个子节点。 我对其他类型的数据结构或特殊树持开放态度,这将使获取叶节点特别理想。 我正在使用javascript,但实际上只是在寻找一般建议,任何语言等。 谢啦!

  • 我正在通过为Ruby编写树库来研究树遍历算法。就基本建筑而言,似乎有两个合理的选择; 只有树。树有根值和子树 存在树和节点。一个节点有一个值,子节点。树有根节点和子树。子树的根节点是树的根节点的子节点 其中一种设计更常见吗?在这个库的开发过程中,1)太幼稚或2)不必要的冗余会变得“明显”吗?本图书馆的预期用途为一般用途;我希望它可以用于巨树、二进制搜索树或解析树等。 我能想到其他不那么合理的建筑;

  • mysql树形结构筛选 mysql版本:5.7 有如下结构: id:主键ID pid:树形结构,标识当前行的父节点ID full_path:当前行在树形结构中的路径,例如当前id为10,父节点为9,那么他的full_path为:9-10 例如在经过某一轮筛选后,有如下数据,或者说某个账号只能看到如下数据 注意ID为100的数据,它的父节点99是存在的,只是业务逻辑中无法得到该节点的数据 现在有如下

  • 树形结构如图 比如说有一个id数组arr=[2,7,8] 根据这个数组获取所有id相同的name,返回一个name数组 树形结构示例如下

  • 问题内容: 表-用户 列-(userId,name,managerId) 行- 如果我提供用户ID,则应列出所有向他报告的人。如果我给userId = 2,则应返回3,4。 这个查询正确吗 有什么有效的方法来管理DB中的树结构吗?左右叶方式怎么样? 问题答案: 在我看来,邻接列表模型的问题在于,在SQL中很难处理它,尤其是当您不知道树结构的嵌套深度时。 您提到的“左右叶方式”可能是嵌套集合模型,它

  • 我有一棵看起来像上面的树,由一个链接结构表示: 我的目标是找到从根节点到叶节点的所有路径。 我的树遍历算法如下所示: 当我运行它时,我确信树正在按图所示构建。我已经测试过了。然而,我无法找出我的树遍历分割错误的原因。 我得到的输出是: 我已经在高度较小的树上测试了它,它是有效的。但是出于某种原因,它不适用于高度大于2的树。我认为这是树出了问题,我检查并打印了每个父级、左子级和右子级,它们打印出来如