[英]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.