open-policy-agent - 联合 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;假设对象键是唯一的(如在您的示例中),您可以简单地使用理解:
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"
]
}
推荐阅读
- css - 在引导布局中安装固定的 wordpress 菜单
- c# - 如果加载的图像来自资源,如何在图片框中放置边框颜色?
- apache-spark - Spark 流 - forEach writeStream - 如何在输入数据帧上调用 write()
- amazon-s3 - . ./filename 命令在使用 MINGW64 在批处理文件中运行时不起作用
- google-bigquery - 在 BigQuery 中清理数据的最有效方法
- javascript - 想要显示以逗号结尾的数组的第一个索引(日期-时间-时区)
- c - 如何通过管道传输两个现有的文件描述符(一个来自套接字)?
- express - TypeORM 在 Nest.js 中使用 queryBuilder 插入后会引发错误
- sql - 将值放在 2 个单引号 Oracle Sql 之间
- reactjs - React-vis 截断 LineSeries/LineMarkSeries XYPlot 边界外的线