如何从数组中查找具有特定扩展名的文件列表
Posted
技术标签:
【中文标题】如何从数组中查找具有特定扩展名的文件列表【英文标题】:How to Find List of Files with Certain Extension From an Array 【发布时间】:2016-10-18 07:37:09 【问题描述】:我一直在学习 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()
更好的方法来在单独的行上输出数组的元素?
谢谢
【问题讨论】:
试试MDN 【参考方案1】:它看起来像您使用 .filter() - 而不是提供扩展名作为函数的参数,您需要提供一个回调,它将在列表的每个元素上调用,并且只返回值通过特定测试(在这种情况下,文件扩展名存在于字符串中)。
例如
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”可以在函数范围内访问,因为它在父级中可用
【讨论】:
【参考方案2】:您错误地使用了.filter
。此方法接收一个函数参数,该参数应用于每个数组元素,并决定该元素是否应保留在新列表中。你所做的是为这个函数提供一个字符串,但是它应该如何使用这个字符串来过滤数组元素呢?它应该以具有此字符串作为前缀的元素吗?是否应该取不包含该字符串的元素?
您应该确定程序选择保留和丢弃哪个字符串的方式。
在您的情况下,您希望通过扩展名(或后缀)进行过滤。您可以为此目的传递的函数可能是,例如:
list.filter(file => file.endsWith(extname));
这将逐个文件传递,并根据需要仅选择以给定扩展名结尾的那些。
andrewkodesgood 回答的问题在于,给定的扩展名不必放在文件名的末尾,也可以放在中间甚至开头。
【讨论】:
【参考方案3】:只是另一种可能的方式。
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"]
*/
【讨论】:
以上是关于如何从数组中查找具有特定扩展名的文件列表的主要内容,如果未能解决你的问题,请参考以下文章