根据元素中的键列表创建地图

时间:2020-09-18 09:51:21

标签: terraform

我正在尝试将物品列表转换为地图。 元素包含一个名为标签的键,该键包含多个以','

分隔的标签

密钥应与包含标签的所有节点匹配。

variable "list" {
  type = list(map(string))
  default = [
    { a : "a", tags : "k1" },
    { a : "b", tags : "k1" },
    { a : "c", tags : "k1,k2" },
    { a : "d", tags : "k2" },
    { a : "e", tags : "k2" }
  ]
}
    
// Output wanted
// {
//  "k1" : [{a: a}, {a: b}, {a: c}],
//  "k2" : [{a: d}, {a: e}, {a: c}]
// }

我尝试过:

[for n in var.list: {for t in split(",", n["tags"]): t => n}]

[
  {
    "k1" = {a: a}
  },
  {
    "k1" = {a: b}
  },
  {
    "k1" = {a: c},
    "k2" = {a: c}
  },
  {
    "k2" = {a: d}
  },
  {
    "k2" = {a: e}
  },
]

但是在那之后我不知道如何合并它。

1 个答案:

答案 0 :(得分:1)

这有点棘手。我使用了两个辅助数据类型,helper_listhelper_map。第一个检查k1k2中存在哪些键。第二 创建具有单个值的列表。 final_maphelper_map转换为所需的地图:

locals {

  helper_list = distinct(flatten(
        [for n in var.list: [for t in split(",", n["tags"]): t]]))
        
  helper_map = flatten([
             for k in local.helper_list:
             [
               for item in var.list: 
               {"${k}" = {a = item["a"]}} if length(regexall(k, item["tags"])) > 0
             ]
           ])
        
  final_map = {for item in local.helper_map: keys(item)[0] => values(item)[0]...}
}


output "test1" {
   value = local.final_map
}

结果:

est1 = {
  "k1" = [
    {
      "a" = "a"
    },
    {
      "a" = "b"
    },
    {
      "a" = "c"
    },
  ]
  "k2" = [
    {
      "a" = "c"
    },
    {
      "a" = "d"
    },
    {
      "a" = "e"
    },
  ]
}