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

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"]
*/