The map
block
Use the map
block to convert a list into a map (key-value pair) or a nested map within a globals
or lets
block. You can use the map
block to store configuration data in variables and pass them between different parts of the infrastructure code. If you have multiple objects in a list with one or more identical keys, you can merge values corresponding to the identical keys while iterating over them. For each object in the list, you can access the previous or the current value of any of its keys. In the for-each
iteration, the iterator (default name element
) is an object with the following properties:
element = {
new = <current element>
old = <previous set value in the object> || null
}
Arguments
The map
block can only be used inside the globals
or lets
block, requires one label and optionally accepts a value
.
name | type | description |
---|---|---|
for_each | list(any) | The input list |
key | string | The computed key |
value | any | The value for the key |
value | block* | value properties |
The value
block and the value
attribute cannot be used together.
Syntax
globals {
map totals {
for_each = global.orders
key = element.new.name
value {
total_spent = tm_try(element.old.total_spent, 0) + element.new.price
}
}
}
Examples
Let's convert the global.orders
list below into a nested object organized by name and product.
globals {
orders = [
{ name = "Morpheus", product = "sunglass", price = 100.5 },
{ name = "Trinity", product = "cape", price = 82.30 },
{ name = "Trinity", product = "necklace", price = 25.0 },
{ name = "Trinity", product = "sunglass", price = 100.5 },
{ name = "Anderson", product = "ollydbg", price = 30 },
{ name = "Morpheus", product = "boot", price = 65 },
{ name = "Anderson", product = "cape", price = 82.30 },
{ name = "Morpheus", product = "sunglass", price = 145.50 },
]
}
Structure those values by product
for each name
by using the nested map
block as defined below:
globals {
map totals {
for_each = global.orders
iterator = per_name
key = per_name.new.name
value {
total_spent = tm_try(per_name.old.total_spent, 0) + per_name.new.price
map per_product {
for_each = [for v in global.orders : v if v.name == per_name.new.name]
iterator = per_product
key = per_product.new.product
value {
total = tm_try(per_product.old.total, 0) + per_product.new.price
}
}
}
}
}
It will result in the below object:
obj = {
Anderson = {
total_spent = 112.3
per_product = {
cape = {
total = 82.3
}
ollydbg = {
total = 30
}
}
}
Morpheus = {
total_spent = 311
per_product = {
boot = {
total = 65
}
sunglass = {
total = 246
}
}
}
Trinity = {
total_spent = 207.8
per_product = {
cape = {
total = 82.3
}
necklace = {
total = 25
}
sunglass = {
total = 100.5
}
}
}
}