一、需求描述:
在树结构数据中,已给出叶子节点上的 count 值(这里的 count 可以是其它任意 Number 型数据),要求对已给的叶子节点的 count 值求和,并将求和的结果赋值给父节点的 count。
二、效果展示:
给出 2-1、2-2、2-3、2-4、3-1、3-2 这几个节点的 count 值,要计算出 2-5、1-2 的 count 值(本文用 element-ui 的 el-tree 来渲染树,不过内容与 el-tree 无关,是纯 js)
三、完整代码如下:
let treeData = [
{
label: '1-1',
children: [],
count: 0,
},
{
label: '1-2',
count: 0,
children: [
{
label: '2-1',
count: 1,
},
{
label: '2-2',
count: 2,
},
{
label: '2-3',
count: 3,
},
{
label: '2-4',
count: 4,
},
{
label: '2-5',
count: 0,
children: [
{
label: '3-1',
count: 10,
},
{
label: '3-2',
count: 11,
},
]
},
]
}
]
// 递归计算 count 值
function recursivelyCalculateCount(arr) {
// 递归开头的判断条件
if (Array.isArray(arr) && arr.length === 0) return 0
// 获取递归数组的长度
let len = arr.length
// 从最后最里的数据 向 最前最外的数据遍历,
// 这里算是函数的核心,
// 如果 从前往后从外向里 求和的话,1-2的值就不是31,而是10了,这显然不是我们想要的
while(len--) {
if (arr[len].children) {
arr[len].count += recursivelyCalculateCount(arr[len].children)
}
}
// 对叶子节点的 count 进行求和,并将求和的结果 return 出去
const res = arr.reduce((pre, cur) => pre + cur.count, 0)
return res
}
recursivelyCalculateCount(treeData)
console.log(treeData, 'treeData')