如何使用Array.prototype.filter筛选出包含指定数组子串的数组元素
如何用Array.prototype.filter简化带时间戳的文件名筛选?
我现在有两个数组:
- 带时间戳的文件名数组:
const allNewspaper = [ 'wall_street_journal_1631199606466.csv' ,'newyork_times_1631199606505.csv' ,'washington_post_1631199606516.csv' ]; - 需要保留的文件名称数组(不含时间戳):
const wantedNewspaper = [ 'wall_street_journal' ,'washington_post' ];
我想要得到只包含第一个数组中匹配第二个数组元素的结果数组:
const allAcceptedNewspaper = [ 'wall_street_journal_1631199606466.csv' ,'washington_post_1631199606516.csv' ];
目前我是用循环遍历allNewspaper,逐个检查是否存在wantedNewspaper中的子串,想请教有没有用Array.prototype.filter实现的更简洁方法?
当然可以用filter来实现,而且代码会更简洁易读!核心思路是利用filter遍历数组,对每个文件名判断是否匹配wantedNewspaper中的任意一个关键词,下面给你两种实用的实现方式:
方法一:结合some()的基础实现
这是最直观的写法,直接在filter的回调里用some()检查当前文件名是否包含任意一个目标关键词:
const allAcceptedNewspaper = allNewspaper.filter(fileName => wantedNewspaper.some(wanted => fileName.includes(wanted)) );
逻辑很清晰:filter会留下所有让回调返回true的元素,而some()只要有一个关键词匹配就返回true,完美契合你的需求。
方法二:用正则表达式优化(适合固定格式的文件名)
如果你的文件名格式是[名称]_[时间戳].csv这种固定模式,还可以把wantedNewspaper转成正则表达式,这样匹配更精准,效率也更高(尤其是数组元素很多的时候):
const wantedRegex = new RegExp(`^(${wantedNewspaper.join('|')})_\\d+\\.csv$`); const allAcceptedNewspaper = allNewspaper.filter(fileName => wantedRegex.test(fileName));
这个正则会严格匹配[目标名称]_[数字时间戳].csv的格式,能避免类似wall_street_journal_extra_123.csv这种误匹配的情况,安全性更强。
和循环写法对比
这两种方法都是声明式编程的思路——你只需要告诉代码“要筛选出符合什么条件的元素”,不用手动控制遍历的细节,代码可读性和维护性都比手动循环好很多。
内容的提问来源于stack exchange,提问作者oderfla
相关产品推荐
相关产品推荐

