1|
2|
3|
4|
5|
6|
7|
8|
9|
10|
11|
12|
13|
14|
15|
16|
17|
18|
19|
20|
21|
22|
23|
24|
25|
26|
27|
28|
29|
30|
31|
32|
33|
34|
35|
36|
37|
38|
39|
export type TreeNode = { name: string } & ({
kind: 'folder',
children: TreeNode[],
} | {
kind: 'file',
});
export const buildTree = (list: string[]) => {
const tree: TreeNode[] = [];
const getFolder = (path: string[], t = tree) => {
for (const p of path) {
let f = t.find((x) => x.name === p);
if (!f) {
f = {
name: p,
kind: 'folder',
children: [],
};
t.push(f);
}
if (f.kind === 'file') {
throw new Error("Folder and file with same name");
}
t = f.children;
}
return t;
}
list
.forEach((x) => {
let sx = x.split('/');
const folder = getFolder(sx.slice(0, -1));
folder.push({
kind: 'file',
name: sx[sx.length - 1],
});
});
return tree;
};