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、使用第三方库如lodash
的flatMapDepth
方法来简化代码。
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]