Comenzando con una cadena que tiene la ruta completa de un archivo, armé esta función para recorrer los directorios de la ruta del archivo hacia atrás. Funciona, pero mi instinto me dice que estoy cocinando demasiado la tubería y decidí que esta era una buena oportunidad para una experiencia de aprendizaje. ¿Cómo refactorizaría esto para que sea más sucinto?
const path = require('path') function walk(file) { let dir = path.dirname(file) let arr = dir.split('/').filter(e => e).reverse() let paths = [] for(let i = arr.length; i >= 0; i--) { let sub = arr.slice(i) paths.push(sub.reverse().join('/')) } paths = paths.filter(e => e).reverse() paths.forEach(path => { console.log('/' + path) }) } walk('/D0/D1/D2/D3/foo.bar')Otra versión recursiva más simple:
const path = require('path'); function walk(start) { const dir = path.dirname(start) console.log(dir); if (dir !== '/') { walk(dir); } } walk('/D0/D1/D2/D3/foo.bar');Saldrá:
"/D0/D1/D2/D3" "/D0/D1/D2" "/D0/D1" "/D0" "/"Podrías usar una función recursiva.
te dejo aqui un ejemplo
const path = require('path') function walk(file) { let dir = path.dirname(file) walkRecursively(dir.split('/')) } function walkRecursively(dirs) { if(dirs.length < 2) { return; } console.log(path.join(dirs)) const nextDirs = dirs.slice(0, -1) walkRecursively(nextDirs) } walk('/D0/D1/D2/D3/foo.bar')puedes hacer algo como esto
function walk(file) { const path = file.split('/').filter(e => e).slice(0, -1) const result = path.reduce((res, p, i) => { return [ ...res, `${res[i - 1] || ''}/${p}` ] }, []).reverse() console.log(result) } walk('/D0/D1/D2/D3/foo.bar')