用来记录总是忘; 感兴趣的小伙伴可以写在评论里进行持续优化呦~~~
/**
* @function filterEmptyNode
* @description 当子节点为空时,去掉父节点
* @param items 当前数据
* @param args { childrenKey: 'children', levelMax: null as any, num: 1 }
* childrenKey:是子节点的key;levelMax:最大层级;num:循环的当前层级,一级:1 ,二级:2 ,...
*/
export function filterEmptyNode(
items: Array<IFormData>,
args = { childrenKey: 'children', levelMax: null as any, num: 1 }
) {
// 判空 如果没数据直接返回
if (!items || items.length === 0) {
return items
}
// 计算最高level的默认值
if (!args.levelMax || args.levelMax === null) {
// 获取最大level
args.levelMax = maxLength(items) // 一级:1 ,二级:2 ,...
// 如果最大值就是1级 直接返回数组
if (args.levelMax === 1) {
return items
}
}
// 当前层级的默认值
if (!args.num) {
args.num = 1 // 一级:1 ,二级:2 ,...
}
for (let i = 0; i < items.length; i += 1) {
if (!!items[i][args.childrenKey] && items[i][args.childrenKey].length > 0) {
// 筛选下一级
const node = filterEmptyNode(items[i][args.childrenKey], {
...args,
num: args.num + 1
})
// 返回的node节点时空的话 说明子节点已经被删除完 不满足条件删除掉
if (node.length === 0) {
// 不是组后一级的话 并且没有子节点 就删除掉该数据
items.splice(i, 1)
// 删除完数据 i往前进一位
i -= 1
}
} else if (args.num < args.levelMax) {
// 不是组后一级的话 并且没有子节点 就删除掉该数据
items.splice(i, 1)
// 删除完数据 i往前进一位
i -= 1
}
}
return items
}