联合 rego 中的一组对象
Union an array of objects in rego
如何在 rego
中将一组对象合并为一个对象?
我知道如何联合两个对象,但我如何遍历对象数组?
此示例有效,但(显然)不可扩展 ;)
a := [{"test1": "123"}, {"test2": "456"}, {"test3": "789", "test4": "012"}]
b := {
"my-property": object.union(object.union(a[0], a[1]), a[2])
}
预期输出:
{
"test1": "123",
"test2": "456",
"test3": "789",
"test4": "012"
}
谢谢!
卡斯帕
TLDR;假设对象键是唯一的(就像在你的例子中一样),你可以简单地使用 comprehension:
b := {k: v |
some i, k
v := a[i][k]
}
由于变量i
只用了一次,你可以用_
代替它,这样就不用起名字了:
b := {k: v |
some k
v := a[_][k]
}
如果对象键不是唯一的,那么它会稍微复杂一些,因为当两个对象包含具有不同值的相同键时,您需要决定如何解决冲突。您决定如何解决冲突将取决于用例。解决它们的一种方法是按键对值进行分组。例如:
# the 'test2' key appears in more than one object with a different value
a := [{"test1": "123"}, {"test2": "456"}, {"test3": "789", "test2": "012"}]
要按键对值进行分组,您可以编写嵌套理解:
{k: vs |
# for each key 'k'
some k
conflicting[_][k]
# find all values for key 'k' and group as a set
vs := {v | v := conflicting[_][k]}
}
输出:
{
"test1": [
"123"
],
"test2": [
"012",
"456"
],
"test3": [
"789"
]
}
如何在 rego
中将一组对象合并为一个对象?
我知道如何联合两个对象,但我如何遍历对象数组?
此示例有效,但(显然)不可扩展 ;)
a := [{"test1": "123"}, {"test2": "456"}, {"test3": "789", "test4": "012"}]
b := {
"my-property": object.union(object.union(a[0], a[1]), a[2])
}
预期输出:
{
"test1": "123",
"test2": "456",
"test3": "789",
"test4": "012"
}
谢谢!
卡斯帕
TLDR;假设对象键是唯一的(就像在你的例子中一样),你可以简单地使用 comprehension:
b := {k: v |
some i, k
v := a[i][k]
}
由于变量i
只用了一次,你可以用_
代替它,这样就不用起名字了:
b := {k: v |
some k
v := a[_][k]
}
如果对象键不是唯一的,那么它会稍微复杂一些,因为当两个对象包含具有不同值的相同键时,您需要决定如何解决冲突。您决定如何解决冲突将取决于用例。解决它们的一种方法是按键对值进行分组。例如:
# the 'test2' key appears in more than one object with a different value
a := [{"test1": "123"}, {"test2": "456"}, {"test3": "789", "test2": "012"}]
要按键对值进行分组,您可以编写嵌套理解:
{k: vs |
# for each key 'k'
some k
conflicting[_][k]
# find all values for key 'k' and group as a set
vs := {v | v := conflicting[_][k]}
}
输出:
{
"test1": [
"123"
],
"test2": [
"012",
"456"
],
"test3": [
"789"
]
}