javascript - ¿Cómo convertir un array de rutas en un objeto árbol?
Quiero convertir un array de rutas de archivos y carpetas en un objeto árbol (un array de objetos como el siguiente, los hijos apuntan al array de sí mismos):
type TreeItem<T> = {
title: T
key: T
type: 'tree' | 'blob'
children: Array<TreeItem<T>>
}
Las rutas de archivos y carpetas provienen del comando "git ls-tree -r -t HEAD" que lista el objeto árbol de un repositorio git, se ve como a continuación:
100644 blob 68afe6febb3f4ab2155b436e2e5a43f62399388b LICENSE
100644 blob 78d926deaf73e93c12257d0be9dc10f39662aad0 README.md
040000 tree eefd18d086bb6089a4e392bda3105fd32399146b app
100644 blob 631e6d753849db0ed05d0124ab62c8e5522f1c32 app/.npmrc
100644 blob 72da957f1fec5b3dec8e89e9ab9364bb96a929b0 app/.yarnrc
100644 blob cb66e81274ca308805350d8c1ccc68811994ed1c app/app-info.ts
100644 blob 1bf399b381dab7c260c1dc4126025c7ab1a437af app/git-info.ts
100644 blob ec6e40fb46f6554d62823e5f27a8743de594acff app/package-info.ts
100644 blob bf92f9a597bfd8b8e9b2308a4848faa6937f4a1e app/package.json
040000 tree dd30a6b5ee422a42da4561ea8443ef8a4a82c078 app/src
040000 tree c8473c433cf8ec2a3d9b67171cff665d7176f264 app/src/ask-pass
100644 blob 76adbc48d6d239fd39eab1ea08c8ee2408df3ece app/src/ask-pass/ask-pass.ts
100644 blob e1de6d753ce44680071ab7c67615e2d81b279c21 app/src/ask-pass/main.ts
...
Como puedes ver, puedo decir si es un archivo o una carpeta por la segunda columna. Y definí una estructura como la siguiente para el objeto de archivo y carpeta de arriba:
interface GitTreeObject {
readonly type: string
readonly hash: string
readonly path: string
}
Lo que significa que quiero convertir el Array<'GitTreeObject> en Array<'TreeItem>. ¿Alguien sabe cómo implementar la conversión? Es mejor implementar con Typescript. Gracias de antemano.
Mi requisito es similar a este, y traté de referirme a la respuesta de esa pregunta, pero fallé
Respuesta #1
Tomando solo los caminos, podrías dividirlos y reducir el camino hasta que obtengas un objeto. En este objeto, luego podrías añadir los datos deseados.
var data = ['LICENSE', 'README.md', 'app', 'app/.npmrc', 'app/.yarnrc', 'app/app-info.ts', 'app/git-info.ts', 'app/package-info.ts', 'app/package.json', 'app/src', 'app/src/ask-pass', 'app/src/ask-pass/ask-pass.ts', 'app/src/ask-pass/main.ts'],
result = {};
data.forEach(p => p.split('/').reduce((o, k) => o[k] = o[k] || {}, result));
console.log(result);