Estoy tratando de escribir un programa de nodo que lea un director de archivo y filtre aquellos sin una determinada extensión de archivo. (Este es un desafío para learnyounode ) Por alguna razón, se agrega a la lista 'indefinido'. puede alguien decirme por que?
var fs = require('fs') var path = process.argv[2]; var ext = process.argv[3]; var fileList = fs.readdir(path, function callback(err, list){ if (err){ throw err; } var filteredList = list.filter(function(fileName){ var extRx = new RegExp('\.' + 'md' + '$'); return extRx.test(fileName); }); console.log(filteredList.forEach(function(val){console.log(val)})); });Salidas:
ACTUAL EXPECTED "CHANGELOG.md" == "CHANGELOG.md" "LICENCE.md" == "LICENCE.md" "README.md" == "README.md" "undefined" != "" "" !=Parece que en realidad es un artefacto de su enfoque de consola. Está registrando en la consola cada elemento en la lista filtrada y luego en la consola registrando el resultado de la función forEach. La función forEach no tiene un valor de retorno, por lo que está devolviendo 'indefinido' que luego registra su consola externa.
Considere cambiar el registro de su consola a solo:
console.log(filteredList);No incluyó un ejemplo ejecutable, por lo que es imposible decirle qué está mal con el código que no incluyó, especialmente cuando ni siquiera incluye la lista real de archivos que está tratando de filtrar.
Mira este ejemplo:
var list = [ "CHANGELOG.md", "LICENCE.md", "README.md", "undefined", "", ]; var filteredList = list.filter(function(fileName){ var extRx = new RegExp('\.' + 'md' + '$'); return extRx.test(fileName); }); console.log(filteredList);Esto filtra correctamente los valores que desea. Cambie su programa para tener una instrucción console.log para asegurarse de que sabe lo que se está imprimiendo:
console.log(filteredList);o:
console.log(JSON.stringify(filteredList));Un consejo, no lo compliques tanto:
var filteredList = list.filter(function(fileName){ var extRx = new RegExp('\.' + 'md' + '$'); return extRx.test(fileName); });cuando todo lo que necesitas es:
var filteredList = list.filter(name => name.match(/\.md$/));Tendrá menos problemas para depurar su código si lo mantiene simple.
Después de leer los comentarios, veo que 'md' es solo un marcador de posición y está usando argumentos de línea de comando en el código real. En ese caso, usaría escape-string-regexp para escapar de la cadena. Ver:
Cuando usa escape-string-regexp :
var escape = require('escape-string-regexp');Puedes hacer algo como:
var extRx = new RegExp('[.]' + escape(ext) + '$'); donde ext es la extensión de archivo que obtuvo como argumento de línea de comando.
El [.] aquí es solo mi preferencia personal de escribir un punto literal en expresiones regulares, creo que es más legible pero no cambia ningún comportamiento aquí. La huida es más importante.
Si no escapa de la cadena porque desea que sus usuarios puedan usar una expresión regular personalizada en lugar de cadenas literales, entonces al menos debería envolver la new RegExp() en try / catch porque puede generar excepciones en sintaxis de expresiones regulares no válida.