Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

106
Vistas
Map and filter in one method?

The following code processes a list of file paths and should return only the file names (without extension) of XML files. Currently I got to this:

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 capture

I find this code quite cumbersome. Is there no way to combine the matching and filtering in a more "efficient" way? And by "efficient" I mean code-readable-efficient and not time-efficient as the input array holds 100 values at most but most of the time between 10 and 20.

about 4 years ago · Juan Pablo Isaza
3 Respuestas
Responde la pregunta

0

This doesn't solve your need of mapping and filtering out the non matching values in one shot... but it makes one step easier by using the optional chaining operator ?.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining

I also slightly changed the regex to allow the filename with no path specifed.

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);

about 4 years ago · Juan Pablo Isaza Denunciar

0

You can (ab)use flat map:

const filteredFiles = files.flatMap((f)=>{
  let match = f.match('...');
  if (match) {
      return [match[1]]
  } else {
      return []
  }
})

Not sure if it's actually better than the original though.

about 4 years ago · Juan Pablo Isaza Denunciar

0

Map and filter, otherwise known as reduce

const rx = /\/(.*)\.xml$/;

const filteredFiles = files.reduce((arr, f) => {
  const match = f.match(rx);
  return match ? [...arr, match[1]] : arr;
}, []);
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda