>>108264667
type PathObject = {
[key: string]: PathObject | null;
} | null;
type PathString = string;
const pathList: PathString[] = [
"src/index.js",
"src/utils/helpers.js",
"src/utils/math/add.js",
"public/index.html",
"README.md"
]
function getPathObject(pathList: PathString[]): PathObject {
if (!pathList.length) return null;
const result: PathObject = {}
const keyCollector: Record<string, string[]> = {}
for (const path of pathList) {
const slashIndex = path.indexOf("/")
const key = path.slice(0, slashIndex > 0 ? slashIndex : path.length)
const subpath = slashIndex > 0 ? path.slice(slashIndex + 1) : undefined;
keyCollector[key] ??= [];
if (subpath !== undefined) {
keyCollector[key].push(subpath);
}
}
for (const key in keyCollector) {
result[key] = getPathObject(keyCollector[key])
}
return result;
}
function indentedLog(indent: number, message: string): void {
console.log(`${' '.repeat(indent)}${message}`)
}
function pprintPathObject(pathObject: PathObject, indent = 2): void {
function walk(obj: PathObject, currentIndent: number): void {
for (const key in obj) {
const sub = obj[key];
if (!sub) {
indentedLog(currentIndent, key);
continue;
}
indentedLog(currentIndent, `${key}/`);
walk(sub, currentIndent + indent);
}
}
walk(pathObject, 0);
}
console.clear()
pprintPathObject(getPathObject(pathList))
was fun