如何仅用嵌套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
相关产品推荐
相关产品推荐

