我正在努力进行这种插值,我下面有变量。
primary = ["foo.dev","all.bar.com"]
secondary = ["module.foo.dev","*.foo.dev","all.bar.com"]
我希望我的输出是
{
"foo.dev" = ["module.foo.dev","*foo.dev"]
"all.bar.com" = ["all.bar.com"]
}
使用地形 0.12.20
我在地形控制台中尝试过,无法实现所需的输出。有什么简单的解决方案吗?
[for i in ["foo.dev","all.bar.com"]: map(i,[for j in ["module.foo.dev","*foo.dev","all.bar.com"]: replace(j,i,"")!=j == true ? j : 0])]
[
{
"foo.dev" = [
"module.foo.dev",
"*foo.dev",
"0",
]
},
{
"all.bar.com" = [
"0",
"0",
"all.bar.com",
]
},
]
您可以使用以下表达式执行此操作:
{ for i in ["foo.dev", "all.bar.com"] : i => [for j in ["module.foo.dev", "*foo.dev", "all.bar.com"] : j if can(regex(i, j))] }
这将产生以下值:
{
"all.bar.com" = [
"all.bar.com",
]
"foo.dev" = [
"module.foo.dev",
"*foo.dev",
]
}
这正是您所要求的。
迭代解释如下:
首先,指定类型为地图:
{}
现在,我们应该遍历第一个列表中的元素:
{ for i in ["foo.dev", "all.bar.com"] : }
接下来,我们将i
值分配给映射的键,并为该值初始化一个列表:
{ for i in ["foo.dev", "all.bar.com"] : i => [] }
但是,我们需要将第二个列表中的元素中的值分配给结果映射键的列表(下面的示例是次优的,因为我们不需要for
表达式,但它是下一步的说明(:
{ for i in ["foo.dev", "all.bar.com"] : i => [for j in ["module.foo.dev", "*foo.dev", "all.bar.com"] : j] }
最后,我们要根据键过滤列表值中的元素。我们可以在regex
函数之外使用can
函数,根据是否存在匹配项返回布尔值。我们将其用于是否应将第二个列表的元素添加到值中的列表中的条件:
{ for i in ["foo.dev", "all.bar.com"] : i => [for j in ["module.foo.dev", "*foo.dev", "all.bar.com"] : j if can(regex(i, j))] }
我们已经找到了解决方案。