具有多个startsWith 和endsWith 参数的过滤器数组

K.J*_*J.K 1 javascript

浏览了围绕这个问题的几个不同的问题/答案,但大多数依赖includesindexOf

问题:如何过滤任何数组(names在这种情况下)。我需要使用 2 个不同的数组对其进行过滤,其中一个具有startsWith条件,另一个具有endsWith条件

var names = ['BOB','CATHY','JAKOB','AARON','JUSTICE','BARBARA','DANIEL','BOBBY','JUSTINE','CADEN','URI','JAYDEN','JULIE']
startPatterns = ['BO','JU']
endPatterns = ['EN','ICE']

//res = ['BOB','JUSTICE','JUSTINE','JULIE','JAYDEN','JUSTICE']
Run Code Online (Sandbox Code Playgroud)

显然你不能这样做,names.filter(d => d.startsWith(startPatterns))因为startPatterns它不是一个字符串而是一个数组。像这样的东西不起作用,而且速度也很慢:

res=[]
names.forEach(d => {
  endPatterns.forEach(y => d.endsWith(y) ? res.push(d) : '')
  startPatterns.forEach(s => d.startsWith(s) ? res.push(d) : '')})
console.log(res)
Run Code Online (Sandbox Code Playgroud)

djf*_*dev 6

您可以Array.prototype.some在模式数组上使用来实现这一点:

let filtered = names.filter(name => (
  startPatterns.some(pattern => name.startsWith(pattern)) ||
  endPatterns.some(pattern => name.endsWith(pattern))
))
Run Code Online (Sandbox Code Playgroud)

这里的逻辑是“true如果名称以至少一种开始模式开始或以至少一种结束模式结束,则返回”。