El siguiente código procesa una lista de rutas de archivo y debe devolver solo los nombres de archivo (sin extensión) de los archivos XML. Actualmente llegué a esto:
const filteredFiles = files .map(f => f.match(/.*\/(.*)\.xml/)) // map to regex match with capture .filter(v => v) // non-matches returned null and will be filtered out here .map(m => m[1]) // map out the regex captureEncuentro este código bastante engorroso. ¿No hay forma de combinar la coincidencia y el filtrado de una manera más "eficiente"? Y por "eficiente" me refiero a código legible-eficiente y no eficiente en el tiempo, ya que la matriz de entrada contiene 100 valores como máximo, pero la mayor parte del tiempo entre 10 y 20.
Esto no resuelve su necesidad de mapear y filtrar los valores que no coinciden de una sola vez... pero facilita un paso al usar el operador de encadenamiento opcional ?.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining
También cambié ligeramente la expresión regular para permitir el nombre de archivo sin especificar la ruta.
const files = [ './path/to/filename_01.xml', 'non_matching_value', './path/to/filename_02.xml', './path/to/filename_03.xml', './path/to/filename_04.xml', 'filename_05.xml', ]; const filteredFiles = files .map(filename => filename.match(/^(.*\/)?(.*)\.xml/)?.[2]) .filter(filename => filename); console.log(filteredFiles);Puede (ab) usar un mapa plano :
const filteredFiles = files.flatMap((f)=>{ let match = f.match('...'); if (match) { return [match[1]] } else { return [] } })Aunque no estoy seguro de si es mejor que el original.