Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

235
Views
Obtener directorios de archivos como objeto de matriz anidado

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.

about 4 years ago · Juan Pablo Isaza
2 answers
Answer question

0

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);
about 4 years ago · Juan Pablo Isaza Report

0

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' } ] } ]
about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!