如何从数组中查找具有某些扩展名的文件列表

时间:2016-06-16 16:49:55

标签: javascript arrays node.js fs

我一直在研究nodeschool教程: learnyounode ,可以找到here。我正在研究挑战五( FILTERED LS )。

挑战是:

  

创建一个程序,打印给定目录中的文件列表,并按文件扩展名进行筛选。您将获得一个目录名作为程序的第一个参数(例如' / path / to / dir /')和一个文件扩展名,作为第二个参数进行筛选。

到目前为止,这是我的代码:

    var fs = require('fs');
    var path = require('path');

    extname = '.' + path.extname(process.argv[3]);

    console.log(extname);

    fs.readdir(process.argv[2].toString(), function(err, list) {

       if (err) {
          throw err;
       }

       list.filter(extname);
       console.log(list);
    });

如何有效过滤掉作为控制台参数提供的所有文件?它与path.extname有关吗?如果是这样,怎么样?我尝试过使用.filter(),但这似乎不起作用。有人也能够向我解释.filter()如何工作以及它的论点,因为我发现文档有点令人困惑。最后,是否有更好的方法在单独的行上输出数组的元素而不是console.log()

由于

2 个答案:

答案 0 :(得分:1)

看起来你使用.filter() - 而不是提供扩展名作为函数的参数,你需要提供一个将在列表的每个元素上调用的回调,并且只返回值传递一个特定的测试(在这种情况下,文件扩展名存在于字符串中)。

例如

numberOfQuestions = 5;

String datesFileName = "dates_file";
String scoresFileName = "scores_file";

try {
    //reading the dates
    String line;
    BufferedReader br = new BufferedReader(new InputStreamReader(openFileInput(datesFileName)));
    while ((line = br.readLine()) != null) {
        numberDateSet.add(line);
    }
    br.close();
    Log.i("ARGH", numberDateSet.size() + " dates");

    //reading the questions answered correctly number
    BufferedReader br2 = new BufferedReader(new InputStreamReader(openFileInput(scoresFileName)));
    while ((line = br2.readLine()) != null) {
        numberCorrectSet.add(line);
    }
    br2.close();
    Log.i("ARGH", numberCorrectSet.size() + " scores");
} catch (Exception e) {
    e.printStackTrace();
}

Javascript使用闭包,因此变量"扩展"可在函数范围内访问,因为它在父

中可用

答案 1 :(得分:0)

您使用的.filter错误。该方法正在接收一个函数自变量,该函数自变量将应用于每个数组元素,并确定此元素是否应保留在新列表中。您要做的是为此函数提供一个字符串,但是它应该如何使用此字符串来过滤数组元素?是否应该将具有此字符串的元素作为前缀?应该采用不包含此字符串的元素吗?

您应该确定程序选择保留哪个字符串和丢弃哪个字符串的方式。

在您的情况下,您希望按扩展名(或后缀)进行过滤。为此,您可以传递的功能可能是:

list.filter(file => file.endsWith(extname));

这将逐个文件地传递文件,并根据需要选择仅以给定扩展名结尾的文件。

andrewkodesgood的答案的问题在于,给定的扩展名不必放在文件名的末尾,而不必放在中间甚至开头。