Hay rutas completas a archivos como
libs/shared/util/something/tsconfig.spec.json apps/project/backend/subfolder/project.json this/has/no/match.json root-file.jsony necesito verificar si el archivo está dentro de una ruta en el objeto de proyectos dado:
const projects = { "just-a-library": "libs/shared/util/something", "project-backend": "apps/project/backend" }Mi problema es que nunca coincidirá completamente, sino solo el comienzo de la cadena, ya que hay subcarpetas opcionales y, por supuesto, nombres de archivo. Si hay una coincidencia, debería devolver la clave de objeto.
Entonces, para libs/shared/util/something/tsconfig.spec.json , debería devolver just-a-library y this/has/no/match.json no debería dar ningún resultado.
No puedo usar string.includes(substring) o string.indexOf(substring) ya que esto es al revés: la cadena completa es la entrada de la ruta del archivo y estoy buscando un posible elemento de subcadena.
Si hago bien la tarea...
const paths = [ "libs/shared/util/something/tsconfig.spec.json", "apps/project/backend/subfolder/project.json", "this/has/no/match.json", "root-file.json", ]; const projects = { "just-a-library": "libs/shared/util/something", "project-backend": "apps/project/backend", }; paths.forEach((path) => { const result = Object.keys(projects).find((k) => path.startsWith(projects[k])) || "[Not found]"; console.log(`${path} - ${result}`); });Producción:
libs/shared/util/something/tsconfig.spec.json - just-a-library apps/project/backend/subfolder/project.json - project-backend root-file.json - [Not found] this/has/no/match.json - [Not found]Si divide los proyectos de entrada y las rutas de archivos, puede crear un directorio a través de un objeto. Una vez que se haya creado, escanee el objeto para encontrar coincidencias.
Se agregaron algunas plantillas para mostrar el directorio.
const projects = { "just-a-library": "libs/shared/util/something", "project-backend": "apps/project/backend" }; const inputs = [ "libs/shared/util/something/tsconfig.spec.json", "apps/project/backend/subfolder/project.json", "this/has/no/match.json", "root-file.json" ]; const createFolders = input => input.split(/\//g); const directory = {}; const project = "__PROJECT__"; const directoryView = document.getElementById("directory"); const projectFolders = {}; Object.keys(projects).forEach(key => { projectFolders[key] = createFolders(projects[key]); }); Object.keys(projectFolders).forEach(key => { let pwd = directory; for (let i = 0; i < projectFolders[key].length; i++) { if (!pwd[projectFolders[key][i]]) { pwd[projectFolders[key][i]] = {}; } pwd = pwd[projectFolders[key][i]]; } pwd[project] = key; }); directoryView.innerText = JSON.stringify(directory, null, 2); const inputFolders = inputs.map(entry => createFolders(entry)); for (let i = 0; i < inputFolders.length; i++) { let pwd = directory; const path = []; for (let j = 0; j < inputFolders[i].length; j++) { if (!pwd[inputFolders[i][j]] && j !== inputFolders[i].length - 1) { if (pwd === directory) { console.log("invalid input path:", inputFolders[i].join("/")); } else { console.log("file:", inputFolders[i].join("/"), "\nmatching project:", pwd[project]); } break; } else { pwd = pwd[inputFolders[i][j]]; path.push(inputFolders[i][j]); } } } <pre id="directory" style="width:100px"></pre>