背景
当前处理树结构的方法,百度搜索内容太碎,不是与当前的需求存在差异就是函数写的不太优雅简洁,所以想着专为树处理封装一个class,集成常见的应用场景,以应对此类的需求,类的数据处理未使用第三方依赖,方法融合了js常见的数据处理方法,也可以参考学习
一维化数据
downGradeData(originData, accTemp = []) {
return originData.reduce((acc, cur) => {
if (cur.children) {
const filterData = Object.keys(cur).filter((item) => item !== 'children');
const convertData = filterData.reduce((accumulator, currentValue) => {
accumulator[currentValue] = cur[currentValue];
return accumulator;
}, {});
accTemp.push(convertData)
return this.downGradeData(cur.children, accTemp);
}
acc.push(cur);
return acc;
}, accTemp)
}
主要思路就是利用Reduce的累加属性,将树数据的每个节点遍历出来,每一个cur如果有children,那就把当前的children传给reduce函数,cur的数据filter出children,把他也传给reduce函数,当为下一次遍历的初始值,横纵循环之后,return出来就是每个节点的数据
获得节点个数
constructor() {
this.nodeCountProps = 0;
}
// 获得节点的个数
nodeCount(originData) {
originData.forEach((ele) => {
if (ele.children) {
this.nodeCountProps += ele.children.length;
this.nodeCount(ele.children);
}
});
return this.nodeCountProps
}
getnodeCount(testData) {
const firstLevel = testData.length;
return this.nodeCount(testData) + firstLevel
};
初始化props节点数置0,递归数据遇到children累加下个数,循环结束之后,再加上最外层数据的length,获得出全部节点的个数,跟其他递归区别就是,不看重每一个节点,看重的是每一个父节点,它的下边有几个子节点
总结
就举例了以上两个方法,其他方法可以在Github上查询,目的就是为了让大家理解递归,以及js循环处理