繁体   English   中英

在 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; 假设对象键是唯一的(就像在你的例子中一样),你可以简单地使用理解

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"
    ]
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM