树的全部展开操作,一般需要获取到所有的树的组件节点key
树的数据结构:
interface TNode {
title: string;
key: number;
children: TNode[];
}
1、查看所有的父节点
function getAllParentKeys(list: TNode[]) {
const keys: number[] = [];
list.forEach(({ key, children }) => {
if (children.length > 0) {
keys.push(key, ...getAllParentKeys(children));
}
});
return keys;
}
2、查找某个指定节点的所有祖先节点
// 找到某个节点的所有祖先节点
function findParentKeys(list: TNode[], childKey: number) {
const resultKey: number[] = [];
canFindKey(list, childKey, resultKey);
return resultKey;
}
function canFindKey(list: TNode[], childKey: number, result: number[]) {
let canFind = false;
// 这里的遍历需要注意!使用some return true可以跳出some循环
// 如果使用forEach return只能跳出当前循环,但是不能终止forEach,可以使用try catch终止
list.some(({ key, children }) => {
if (key === childKey) {
canFind = true;
return true;
}
if (children.length > 0) {
result.push(key);
canFind = canFindKey(children, childKey, result);
if (canFind) {
return true;
}
result.pop();
}
return false;
});
return canFind;
}