Fields can be specified using field comprehensions.

Just like list comprehensions, they use for loops, if guards, and let declarations, combined in any order.

Because field comprehensions specify dynamic fields, these fields can’t be referenced directly and need to be accessed using selectors, index expressions, or aliases.

file.cue
import "strings"

#censusData: [
	{name: "Kinshasa", pop: 16_315_534},
	{name: "Lagos", pop:    15_300_000},
	{name: "Cairo", pop:    10_100_166},
	{name: "Giza", pop:     9_250_791},
]

// city maps from a city's name to its details.
city: {
	for index, value in #censusData
	let lower = strings.ToLower(value.name) {
		"\(lower)": {
			population: value.pop
			name:       value.name
			position:   index + 1
		}
	}
}

// References via selector and index expression.
gizaPopulation:  city.giza.population
cairoPopulation: city["cairo"].population
TERMINAL
$ cue eval -c file.cue
city: {
    kinshasa: {
        population: 16315534
        name:       "Kinshasa"
        position:   1
    }
    lagos: {
        population: 15300000
        name:       "Lagos"
        position:   2
    }
    cairo: {
        population: 10100166
        name:       "Cairo"
        position:   3
    }
    giza: {
        population: 9250791
        name:       "Giza"
        position:   4
    }
}
gizaPopulation:  9250791
cairoPopulation: 10100166