使用JavaScript统计组织树每个层级拥有的所有子层级数

发布时间:2024年01月19日

1、案例:统计每层企业拥有的所有子企业数,将得到的总数 连接在企业的 名称后面,如果该层的children长度为0,则不进行统计(以下方法,根据自身返回的树结构属性进行调改)

    // 获取每个企业的所有子企业
    getSonCom(children, result) {
      let getCount = (children, result) => {
        children.forEach(item => {
          result ++
          if(item.type == "company" && item.children != null) {
            getCount(item.children, result)
          }
        })
        return result
      }
      return getCount(children, result)
    },
    // 通过递归将每个节点的children传给getSonCom方法,进行统计里面的所有子企业,最后返回该企业的所有子企业总数
    selectTreeNode(root) {
      let getTreeNode = (root) => {
        root.forEach(item => {
          if(item.type == "company" && item.children != null) {
            let count = this.getSonCom(item.children, 0)
            item.fullName = `${item.fullName}(${count})`
            getTreeNode(item.children)
          }
        })
      }
      getTreeNode(root)
    },

    // 将获取的树结构调用selectTreeNode方法
    this.selectTreeNode(treeData)

2、使用递归方法遍历树的每个节点,并记录每个层级的子组织数量

function countChildren(tree, level, result) {
  if (!result[level]) {
    result[level] = 0;
  }
  result[level] += tree.length;
  
  for (let i = 0; i < tree.length; i++) {
    if (tree[i].children && tree[i].children.length > 0) {
      countChildren(tree[i].children, level + 1, result);
    }
  }
}

// 示例数据
const tree = [
  {
    id: 1,
    children: [
      {
        id: 2,
        children: [
          {
            id: 3,
            children: []
          },
          {
            id: 4,
            children: []
          }
        ]
      },
      {
        id: 5,
        children: []
      }
    ]
  },
  {
    id: 6,
    children: [
      {
        id: 7,
        children: []
      }
    ]
  }
];

const result = [];
countChildren(tree, 0, result);
console.log(result); // 输出:[2, 3, 1]

3、使用第三方库如lodashflatMapDepth方法来简化代码。

const _ = require('lodash');

// 示例数据
const tree = [
  {
    id: 1,
    children: [
      {
        id: 2,
        children: [
          {
            id: 3,
            children: []
          },
          {
            id: 4,
            children: []
          }
        ]
      },
      {
        id: 5,
        children: []
      }
    ]
  },
  {
    id: 6,
    children: [
      {
        id: 7,
        children: []
      }
    ]
  }
];

const result = _.flatMapDepth(tree, (node) => node.children, 2)
  .reduce((acc, curr) => {
    const level = curr.length - 1;
    if (!acc[level]) {
      acc[level] = 0;
    }
    acc[level]++;
    return acc;
  }, []);

console.log(result); // 输出:[2, 3, 1]

文章来源:https://blog.csdn.net/weixin_48425421/article/details/135676498
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。