如何在Terraform中从嵌套对象列表提取指定字段生成列表
解决Terraform中从嵌套对象列表提取指定字段的问题
要从each.value.house.rooms里生成你需要的两个列表,我们可以利用Terraform的for表达式配合字符串处理函数来实现,具体步骤如下:
1. 提取房间名称列表(room_names)
这个需求很直接,通过遍历rooms列表,直接提取每个房间对象的name字段即可:
room_names = [for room in each.value.house.rooms : room.name]
这段代码会遍历each.value.house.rooms中的每一个房间对象,将每个对象的name值收集成一个新列表,最终得到["living_room", "bed_room"]。
2. 提取家具列表(room_furnitures)
注意到你的输入数据中,每个房间的furnitures是一个包含逗号分隔字符串的单元素列表(比如["chair, table"]),所以我们需要先把这个字符串拆分成单独的元素,再收集成二维列表:
room_furnitures = [ for room in each.value.house.rooms : [ for furniture in room.furnitures : split(", ", trimspace(furniture)) ][0] ]
代码解释:
- 外层
for遍历每个房间对象; - 内层
for处理每个房间的furnitures列表项,先用trimspace去掉字符串两端的空格,再用split(", ", ...)按", "拆分字符串成独立的家具元素; - 最后用
[0]取出拆分后的列表(因为原furnitures是单元素列表),最终得到[["chair","table"], ["bed", "pillow"]]。
完整整合到资源中的示例
把这两个列表定义到你的test资源里,比如作为局部变量或者直接用于资源参数:
resource "test" "test" { for_each = { for asset in var.assets : asset.key => asset } # 定义局部变量存储提取后的列表 locals { room_names = [for room in each.value.house.rooms : room.name] room_furnitures = [ for room in each.value.house.rooms : [ for furniture in room.furnitures : split(", ", trimspace(furniture)) ][0] ] } # 这里可以使用local.room_names和local.room_furnitures作为资源参数 # 例如: # room_names_attr = local.room_names # room_furnitures_attr = local.room_furnitures }
如果你的输入数据中furnitures的分隔符可能存在不一致的情况(比如只有逗号没有空格),可以调整写法让逻辑更健壮,兼容多种格式:
room_furnitures = [ for room in each.value.house.rooms : [ for item in split(",", trimspace(room.furnitures[0])) : trimspace(item) ] ]
这种写法能处理"chair,table"或"chair , table"这类格式的输入,确保拆分后的家具名称没有多余空格。
内容的提问来源于stack exchange,提问作者highDopamine
相关产品推荐
相关产品推荐

