大家开发的时候是不是会经常遇到这种需求,一个N个层级的数组,只有叶子级的数据有金额或者其他的信息,然后需求需要你把每个父级都加上汇总的数据集合。那么我们该怎么做呢?
实战项目需求参考:
上面的数据是计算错误的,圈出来的地方要求数据是正确的,需要计算。
我们自己的解决思路整理如下:
- 既然只有子级有数据,然后上面的每一个层级都需要汇总那么肯定是优先计算最深的层级了。所以我们遍历数据需要做特殊处理或者我们把数组反过来。
- 写个方法进行累加的操作,或者就用数组的reduce方法。
- 把累加的结果追加到他的children末尾项用于展示。
测试用例:
const list = [
{
id: 1,
name: '一班',
age: '',
rate: '',
children: [
{
id: 3,
name: '一组',
age: '',
rate: '',
children: [
{
id: 5,
name: '啊',
age: 2,
rate: 3,
children: null,
}, {
id: 6,
name: '吧',
age: 2,
rate: 3,
children: null,
}
],
}, {
id: 4,
name: '二组',
age: '',
rate: '',
children: [
{
id: 7,
name: '成',
age: 3,
rate: 3,
children: null,
}, {
id: 8,
name: '的',
age: 3,
rate: 3,
children: null,
}
],
}
],
}, {
id: 2,
name: '二班',
age: '',
rate: '',
children: [
{
id: 9,
name: '额',
age: 4,
rate: 5,
children: null,
}, {
id: 10,
name: '发',
age: 4,
rate: 5,
children: null,
}
],
}
];
我们今天就来处理这个数据,把每一个层级都追加个结果项数据。
代码实现:
首先是公共代码:
function isExist(x) {
return x !== null && x !== undefined;
}
function lastTraversalTree(fn, children) {
if (!Array.isArray(children)) return [];
return children.map(child => {
if (child && Array.isArray(child.children)) {
child.children = lastTraversalTree(fn, child.children);
}
return fn(child);
}).filter(isExist);
}
接下来是处理数据的代码
const resList = lastTraversalTree((item) => {
const {children, age, rate} = item;
if (children && children.length > 0) {
let res = {
age: 0,
rate: 0,
children: null,
};
children.forEach(item => {
const { age, rate } = item;
res.age += age || 0;
res.rate += rate || 0;
})
item.age = res.age;
item.rate = res.rate;
children.push({
id: Math.random() + (+new Date()),
name: `${item.name}的数据`,
...res,
})
}
return item;
}, list)
接下来我们看结果:
是不是很棒呢?如果有bug或可优化的地方欢迎大家评论指出修改~!