繁体   English   中英

使用匹配正则表达式过滤数组仅返回第一个匹配项(javascript)

[英]Filter array with match regex only returning the first match (javascript)

我必须过滤一个字符串数组并将其映射到另一个数组中,问题是它只匹配第一个匹配项,而另一个字符串不匹配它,因为我已经在 regex101 上尝试了 apttern 并且它有效。

我有一个名为“堆栈”的对象,其中包含多个变量,为简单起见,我只写了一个我感兴趣的对象(stackName)。 “堆栈”对象:

[
  {
    "stackName": "cc-dev-euw1d-c-1"
  },
  {
    "stackName": "ngi-prd-euw1b-c-3" 
  }
]

我制作了以下代码,以便我可以过滤并将这个“堆栈”对象映射到另一个数组中,在开头添加一个字符串“none”,然后使用正则表达式模式过滤它,该模式查看数字之前末尾的字母是否为' C':

this.oldstacks = ['none', ...stacks
      .filter(stack => stack.stackName.match('c(?=-\d)'))
      .map(stack => stack.stackName)];

例如,这些字符串应该匹配:

cc-dev-agw1d-c-1
dd-prd-agw1b-c-3

但是这些不匹配,因为它们在数字前没有“c”:

dd-prd-agw1b-d-3
dd-prd-agw1b-r-3

我想将 stacks 对象过滤到 oldStacks 对象中,所以它只需要与模式匹配的字符串,但我似乎无法找出如何,因为这样它只需要第一个匹配项,我想要堆栈的所有匹配项。

谢谢

问题是match采用正则表达式而不是字符串,并且您只能使用匹配而不是前瞻断言。

 const stacks = [{ "stackName": "cc-dev-euw1d-c-1" }, { "stackName": "ngi-prd-euw1b-c-3" } ]; const oldstacks = ['none', ...stacks .filter(stack => stack.stackName.match(/c-\d/)) .map(stack => stack.stackName) ]; console.log(oldstacks);

您也可以使用reduce,而不是先过滤然后映射:

 const stacks = [{ "stackName": "cc-dev-euw1d-c-1" }, { "stackName": "ngi-prd-euw1b-c-3" } ]; const oldstacks = ['none', ...stacks .reduce((acc, curr) => { if (/c-\d/.test(curr.stackName)) acc.push((curr.stackName)) return acc; }, []) ]; console.log(oldstacks);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM