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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 06:52:36