Quiero obtener mis directorios de archivos como un objeto de matriz anidado, pero parece que no puedo averiguar cómo convertir
[ 'routes/files', 'routes/files/emptyfolder', 'routes/files/somefolder', 'routes/files/somefolder/example.docx', 'routes/files/test.docx', 'routes/randomdata.json' ]a
[ { title: 'routes', content: [ { title: 'files', content: [ { title: 'empty folder', content: [] }, { title: 'somefolder', content: [ { title: 'example.docx', }, ] }, { title: 'test.docx', } ], }, { title: 'randomdata.json' } ], } ]me parece un problema imposible de resolver. Me encantaría saber cómo solucionarlo.
Gracias.
Así es como lo resolví: no es la mejor solución, pero funciona.
const arr = [ "routes/files", "routes/files/emptyfolder", "routes/files/somefolder", "routes/files/somefolder/example.docx", "routes/files/test.docx", "routes/randomdata.json", ]; const arr2 = arr.map((p) => p.split("/")); const setNestedObjectField = ( obj, props, value ) => { if (!Array.isArray(obj)) { if (!obj.content) { obj.content = []; } obj = obj.content; } for (const propName of props) { const next = obj.find((el) => el.title === propName); if (!next) { console.assert(props.at(-1) === propName); // last propName obj.push(value); } else { if (!next.content) { next.content = []; } obj = next.content; } } }; const rez = []; let index = 0; while (arr2.some((s) => s[index] !== undefined)) { // arr2 = arr2.filter((a) => a.length); const layer = arr2.reduce((acc, pathArr) => { if (pathArr[index] === undefined) return acc; acc.add(pathArr.slice(0, index + 1).join("/")); return acc; }, new Set()); // console.log({ layer }); for (const key of layer) { setNestedObjectField(rez, key.split("/"), { title: key.split("/").at(-1) }); } index++; } console.log(rez);Me encontré con esta pregunta y es un problema interesante, sé que ya fue respondido, pero quería dedicar un poco de mi tiempo a resolverlo a mi manera.
aqui les dejo mi codigo:
function nestedDirectories (arr) { const splittedArray = arr.map(a => a.split('/')); return { mergeObjs: function(target, source) { for (let key in source) { if(!target[key]) target[key] = {}; target[key] = this.mergeObjs(target[key], source[key]); } return target; }, buildResponse: function (objMain) { let arr = []; for (let key in objMain) { let o = { title: key, content: [] }; if(key.includes(".")) { delete o.content; } else if (Object.keys(objMain[key]).length) { o.content = this.buildResponse(objMain[key]); } arr.push(o); } return arr; }, exec: function () { let targetObject = {}; splittedArray.forEach(arrParent => { let strObj = ''; for (let i = arrParent.length - 1; i >= 0 ; i--) { strObj = `"${arrParent[i]}": {${strObj}}`; } let parseObj = JSON.parse(`{${strObj}}`); targetObject = this.mergeObjs(targetObject, parseObj); }); return this.buildResponse(targetObject); } } }y usarlo así:
const dirs = [ 'routes/files', 'routes/files/emptyfolder', 'routes/files/somefolder', 'routes/files/test.docx', 'routes/randomdata.json', 'routes/files/somefolder/example.docx' ]; const data = nestedDirectories(dirs).exec();resultado:
[ { title: 'routes', content: [ { title: 'files', content: [ { title: 'emptyfolder', content: [] }, { title: 'somefolder', content: [ { title: 'example.docx' } ] }, { title: 'test.docx' } ] }, { title: 'randomdata.json' } ] } ]