首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >合并rego中的对象数组

合并rego中的对象数组
EN

Stack Overflow用户
提问于 2020-10-27 20:17:58
回答 1查看 1K关注 0票数 0

如何将对象数组合并为rego中的一个对象

我知道如何合并两个对象,但是如何循环遍历一个对象数组?

此示例工作正常,但它(显然)不可伸缩;)

代码语言:javascript
复制
a := [{"test1": "123"}, {"test2": "456"}, {"test3": "789", "test4": "012"}]

b := {
        "my-property": object.union(object.union(a[0], a[1]), a[2])
     }

预期输出:

代码语言:javascript
复制
{
  "test1": "123", 
  "test2": "456",
  "test3": "789",
  "test4": "012"
}

谢谢!

卡斯珀

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-27 21:10:15

假设对象键是唯一的(如您的示例中所示),您可以简单地使用理解

代码语言:javascript
复制
b := {k: v | 
    some i, k
    v := a[i][k]
}

由于变量i只使用一次,所以可以用_替换它,以避免产生一个名称:

代码语言:javascript
复制
b := {k: v | 
    some k
    v := a[_][k]
}

如果对象键不是唯一的,那么它会稍微复杂一些,因为当两个对象包含具有不同值的相同键时,您需要决定如何解决冲突。您决定如何解决冲突将取决于用例。解决这些问题的一种方法是只按键对值进行分组。例如:

代码语言:javascript
复制
# the 'test2' key appears in more than one object with a different value
a := [{"test1": "123"}, {"test2": "456"}, {"test3": "789", "test2": "012"}]

若要按键对值进行分组,可以编写嵌套理解:

代码语言:javascript
复制
{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]}
}

输出:

代码语言:javascript
复制
{
    "test1": [
        "123"
    ],
    "test2": [
         "012",
         "456"
    ],
    "test3": [
         "789"
    ]
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64562266

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档