53

Obtener extensión de archivo

¿Cómo conseguir la extensión del archivo de manera más eficiente?

Pregunta: ¿Cómo conseguir la extensión de archivo?

var file1 = "50.xsl";
var file2 = "30.doc";
getFileExtension(file1); //returs xsl
getFileExtension(file2); //returs doc

function getFileExtension(filename) {
  /*TODO*/
}

Solucion 1: Expresion regular

function getFileExtension1(filename) {
  return (/[.]/.exec(filename)) ? /[^.]+$/.exec(filename)[0] : undefined;
}

Solucion 2: Metodo split

function getFileExtension2(filename) {
  return filename.split('.').pop();
}

Estas dos soluciones no podían manejar algunos casos extremos, aquí hay otra solución más robusta.

Solucion 3: Metodos slice, lastIndexOf

function getFileExtension3(filename) {
  return filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
}

console.log(getFileExtension3(''));                            // ''
console.log(getFileExtension3('filename'));                    // ''
console.log(getFileExtension3('filename.txt'));                // 'txt'
console.log(getFileExtension3('.hiddenfile'));                 // ''
console.log(getFileExtension3('filename.with.many.dots.ext')); // 'ext'

¿Como funciona?

  • String.lastIndexOf() el método devuelve la última aparición del valor especificado ('.' en este caso). Devuelve -1 si no se encuentra el valor.
  • Los valores de retorno de lastIndexOf para el parámetro 'filename' y '.hiddenfile' son 0 y -1 respectivamente.Zero-fill operador de desplazamiento a la derecha (»>) transformará -1 a 4294967295 y -2 a 4294967294, aquí es un truco para asegurar el nombre del archivo sin cambios en esos casos extremos.
  • String.prototype.slice() extrae la extensión del índice que se calculó anteriormente. Si el índice es mayor que la longitud del nombre de archivo, el resultado es "".

Comparación

Solucion Parametros Resultados
Solucion 1: Expresion regular ’‘
‘filename’
‘filename.txt’
‘.hiddenfile’
‘filename.with.many.dots.ext’
undefined
undefined
‘txt’
‘hiddenfile’
‘ext’
Solucion 2: Metodo split ’‘
‘filename’
‘filename.txt’
‘.hiddenfile’
‘filename.with.many.dots.ext’
’’
‘filename’
‘txt’
‘hiddenfile’
‘ext’
Solucion 3: Metodos slice, lastIndexOf ’‘
‘filename’
‘filename.txt’
‘.hiddenfile’
‘filename.with.many.dots.ext’
’’
‘’
‘txt’
‘’
‘ext’

Demo de performance

Here es la demostración de los códigos anteriores.

Here es la prueba de rendimiento de esos 3 soluciones.

Codigo

How can I get file extensions with JavaScript