如何从数组中查找具有特定扩展名的文件列表
How to Find List of Files with Certain Extension From an Array
我一直在学习 nodeschool 教程:learnyounode,可以找到 here。我正在处理挑战五 (FILTERED LS)。
挑战是这样的:
Create a program that prints a list of files in a given directory, filtered by the extension of the files. You will be provided a directory name as the first argument to your program (e.g. '/path/to/dir/') and a file extension to filter by as the second argument.
到目前为止,这是我的代码:
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()
?
更好的分行输出数组元素的方法?
谢谢
看起来像您对 .filter() 的用法 - 您无需提供扩展名称作为函数的参数,而是需要提供一个将在列表的每个元素上调用的回调,并且仅 return 通过特定测试的值(在这种情况下,文件扩展名出现在字符串中)。
例如
var filelist = ['woohoo.txt', 'aha.pdf', 'wahoo.txt'];
var extension = '.txt';
var x = filelist.filter(function(file){
return file.indexOf(extension) !== -1;
});
console.log(x); // expected output: ['woohoo.txt', 'wahoo.txt']
Javascript 使用闭包,因此变量 "extension" 可以在函数范围内访问,因为它在父级
中可用
您使用的 .filter
不正确。该方法接收一个函数参数,该参数应用于每个数组元素并决定该元素是否应保留在新列表中。你所做的是为这个函数提供一个字符串,但是它应该如何使用这个字符串来过滤数组元素呢?它是否应该将具有此字符串的元素作为前缀?是否应该取不包含该字符串的元素?
您应该确定您的程序选择保留哪些字符串和丢弃哪些字符串的方式。
在您的情况下,您希望通过扩展名(或后缀)进行过滤。您可以为此目的传递的函数可能是,例如:
list.filter(file => file.endsWith(extname));
这将一个文件一个文件地传递,select 只传递那些以给定扩展名结尾的文件,如您所愿。
andrewkodesgood 的回答的问题是给定的扩展名不必放在文件名的末尾,也可以放在中间甚至开头。
只是另一种可能的方式。
let files = [
'/Users/dave/Movies/2021-09-16 08-29-25.mp4',
'/Users/dave/Downloads/video.mp4',
'/System/Library/Movies/Regular.mov',
'/System/Library/Movies/Regular.ttf',
'/System/Library/Movies/Regular.txt',
'/System/Library/Movies/Regular.pdf'
];
let filtered = files.filter(file => ['mp4', 'mov'].includes(file.split('.').pop()));
console.log(filtered);
产出
/*
["/Users/dave/Movies/2021-09-16 08-29-25.mp4", "/Users/dave/Downloads/video.mp4", "/System/Library/Movies/Regular.mov"]
*/
我一直在学习 nodeschool 教程:learnyounode,可以找到 here。我正在处理挑战五 (FILTERED LS)。
挑战是这样的:
Create a program that prints a list of files in a given directory, filtered by the extension of the files. You will be provided a directory name as the first argument to your program (e.g. '/path/to/dir/') and a file extension to filter by as the second argument.
到目前为止,这是我的代码:
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()
?
谢谢
看起来像您对 .filter() 的用法 - 您无需提供扩展名称作为函数的参数,而是需要提供一个将在列表的每个元素上调用的回调,并且仅 return 通过特定测试的值(在这种情况下,文件扩展名出现在字符串中)。
例如
var filelist = ['woohoo.txt', 'aha.pdf', 'wahoo.txt'];
var extension = '.txt';
var x = filelist.filter(function(file){
return file.indexOf(extension) !== -1;
});
console.log(x); // expected output: ['woohoo.txt', 'wahoo.txt']
Javascript 使用闭包,因此变量 "extension" 可以在函数范围内访问,因为它在父级
中可用您使用的 .filter
不正确。该方法接收一个函数参数,该参数应用于每个数组元素并决定该元素是否应保留在新列表中。你所做的是为这个函数提供一个字符串,但是它应该如何使用这个字符串来过滤数组元素呢?它是否应该将具有此字符串的元素作为前缀?是否应该取不包含该字符串的元素?
您应该确定您的程序选择保留哪些字符串和丢弃哪些字符串的方式。
在您的情况下,您希望通过扩展名(或后缀)进行过滤。您可以为此目的传递的函数可能是,例如:
list.filter(file => file.endsWith(extname));
这将一个文件一个文件地传递,select 只传递那些以给定扩展名结尾的文件,如您所愿。
andrewkodesgood 的回答的问题是给定的扩展名不必放在文件名的末尾,也可以放在中间甚至开头。
只是另一种可能的方式。
let files = [
'/Users/dave/Movies/2021-09-16 08-29-25.mp4',
'/Users/dave/Downloads/video.mp4',
'/System/Library/Movies/Regular.mov',
'/System/Library/Movies/Regular.ttf',
'/System/Library/Movies/Regular.txt',
'/System/Library/Movies/Regular.pdf'
];
let filtered = files.filter(file => ['mp4', 'mov'].includes(file.split('.').pop()));
console.log(filtered);
产出
/*
["/Users/dave/Movies/2021-09-16 08-29-25.mp4", "/Users/dave/Downloads/video.mp4", "/System/Library/Movies/Regular.mov"]
*/