You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅用嵌套for循环实现Terraform列表扁平化(替代flatten函数)

如何仅通过嵌套for循环实现Terraform列表扁平化?

我知道可以使用Terraform内置的flatten函数得到预期的列表扁平化结果(以下是对应的实现代码),但我想了解是否可以仅通过嵌套for循环来实现相同的效果。

已知的flatten函数实现代码

output "languages" {
  value = flatten([ 
    for user in var.users: [
      for language in user.languages: language
    ]
  ])
}

变量定义

variable "users" {
  default = {
    "sam" = {
      "name" = "sam"
      "age"  = 22
      "languages" = ["python","nodejs","perl","ruby"]
    },
    "john" = {
      "name" = "john"
      "age"  = 36
      "languages" = ["python","html","cpp","golang","perl","ruby"] 
    },
    "kevin" = {
      "name" = "kevin"
      "age"  = 30
      "languages" = ["python","nodejs","bash","cpp","ruby"] 
    },
    "devid" = {
      "name" = "devid"
      "age"  = 40
      "languages" = ["python","bash","perl","ruby"] 
    },
    "devon" = {
      "name" = "devon"
      "age"  = 25
      "languages" = ["python"] 
    },
    "jain" = {
      "name" = "jain"
      "age"  = 42
      "languages" = ["python","bash","perl","ruby"] 
    }
  }
}

当前使用嵌套for循环的代码

output "languages" {
  value = [ 
    for user in var.users: [
      for language in user.languages: language
    ]
  ]
}

当前输出结果

languages = [
  [
    "python",
    "bash",
    "perl",
    "ruby",
  ],
  [
    "python",
  ],
  [
    "python",
    "bash",
    "perl",
    "ruby",
  ],
  [
    "python",
    "html",
    "cpp",
    "golang",
    "perl",
    "ruby",
  ],
  [
    "python",
    "nodejs",
    "bash",
    "cpp",
    "ruby",
  ],
  [
    "python",
    "nodejs",
    "perl",
    "ruby",
  ],
]

预期输出结果

languages = [
    "python",
    "bash",
    "perl",
    "ruby",
    "python",
    "python",
    "bash",
    "perl",
    "ruby",
    "python",
    "html",
    "cpp",
    "golang",
    "perl",
    "ruby",
    "python",
    "nodejs",
    "bash",
    "cpp",
    "ruby",
    "python",
    "nodejs",
    "perl",
    "ruby",
]

当然可以实现!你只需要调整嵌套for循环的写法,将两层迭代合并到同一个for表达式中,不需要额外嵌套子列表:

output "languages" {
  value = [
    for user in var.users : language
    for language in user.languages
  ]
}

说明

这种写法是Terraform支持的多迭代for表达式,外层遍历每个user,内层遍历该用户的languages列表,每次迭代直接返回language元素,最终会自动将所有元素收集到一个一维列表中,效果和使用flatten函数完全一致。

内容的提问来源于stack exchange,提问作者Fuji Komalan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 07:20:36