You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 09:37:50