2021SC@SDUSC
概述
这周继续分析关于JSON
数据结构的处理部分,学习更多高级的处理函数。
操作
filterTree
过滤树节点,删除不满足条件的节点
export function filterTree<T extends TreeItem>(
tree: Array<T>,
iterator: (item: T, key: number, level: number) => any, // 过滤函数
level: number = 1, // 标识该节点位于树的深度
depthFirst: boolean = false // 标识深度优先
) {
if (depthFirst) {
// 若是深度优先的话
return tree
.map(item => {
// 遍历该节点的所有子节点
// 优先处理更深的节点,返回处理后的子节点
let children: TreeArray | undefined = item.children
// 对每一个子节点,若存在更深的子节点,递归调用 filterTree
? filterTree(item.children, iterator, level + 1, depthFirst)
: undefined; // 否则为 undefined
if (
// children 是数组类型且 item.children 同样是数组类型
Array.isArray(children) &&
Array.isArray(item.children) &&
// 该子节点的下一级子节点被从所在级过滤掉了,导致该子节点的下级子节点数量发生改变
children.length !== item.children.length
) {
// 用新的 children 更新 item.children
item = {
...item, children: children};
} // 其余情况,说明该节点的子节点指针不会发生变化,可能其更下级子节点发生了变化也不影响
return item;
})
// 对本层次的子节点的过滤处理
.filter((item, index) => iterator(item, index, level));
}
// 深度优先类似,处理顺序不一样
return tree
.filter((item, index) => iterator(item, index, level)