我一直在研究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()
?
由于
答案 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的答案的问题在于,给定的扩展名不必放在文件名的末尾,而不必放在中间甚至开头。