In CUE, you often will work with lists of all sorts of values. To ensure a list has no duplicate items, use list.UniqueItems.
Strings
import "list"
items: ["a", "b", "c", "a"]
items: list.UniqueItems
Integers
import "list"
items: [1, 2, 3, 1]
items: list.UniqueItems
Structs
A common issue is we have a list of structs, each with some key that must be unique across all items in the list.
To ensure a list of structs has no duplicate keys, one common approach is to guarantee that the list has no duplicate items by constructing the list from a map.
_items: {
joe: age: 30
alice: age: 35
}
_items: [name=string]: "name": name
items: [
for item in _items {
item
},
]
If the list must be constrained directly, you can write an auxiliary field that creates a mapping from the keys
items: [
{
name: "joe"
age: 30
},
{
name: "alice"
age: 35
},
{
name: "joe"
age: 31
},
]
_itemsCheck: {
for i, item in items {
(item.name): i
}
}
If the key is specified twice, there will be a conflict in _itemsCheck
.
Ensuring multiple keys to have no duplicates
If there are multiple keys that together must be unique, a similar approach can
be used, using
json.Marshal
to form a
composite string key from the keys. Here, for example, the combination of name
and dateOfBirth
must be unique:
import "encoding/json"
items: [
{
name: "joe"
dateOfBirth: "1983-10-21"
country: "US"
},
{
name: "alice"
dateOfBirth: "1987-10-15"
country: "DE"
},
{
name: "joe"
dateOfBirth: "2010-02-05"
country: "UK"
},
{
name: "alice"
dateOfBirth: "1987-10-15"
country: "BE"
},
]
_itemsCheck: {
for i, item in items {
(json.Marshal([item.name, item.dateOfBirth])): i
}
}