Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

188
Views
¿Por qué se agrega undefined a mi lista filtrada?

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" != "" "" !=
over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

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);
over 4 years ago · Santiago Trujillo Report

0

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.

Actualizar

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:

  • https://www.npmjs.com/package/escape-string-regexp

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.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!