繁体   English   中英

如何将列表转换为 object 在 OPA Rego 中具有重复键

[英]How to convert a list to an object with key duplications in OPA Rego

我是 Open Policy Agent (OPA) 和 Rego 语言的新手。 我需要将从输入获得的对象列表转换为 object(最好在 O(n) 时间内)。 问题是使用的密钥可能在列表中重复。 输入示例:

[
    {
        "id": "a",
        "body": {...}
    },
    {
        "id": "b",
        "body": {...}
    },
    {
        "id": "a",
        "body": {...}
    }
]

预期 output:

{
    "a": [
        {
            "id": "a",
            "body": {...}
        },
        {
            "id": "a",
            "body": {...}
        }
    ],
    "b": [
        {
            "id": "b",
            "body": {...}
        }
    ]
}

这样做的最佳选择是什么? 我试图创建一个 function,但从未评估过 output:

package test

inpt := [
    {"id": "a", "body":{"a":1}},
    {"id": "b", "body":{"a":1}},
    {"id": "a", "body":{"a":2}},
]

x := f(inpt)

f(input_list) = output_obj {
    output_obj := {}
    inner := input_list[_]
    inner_list = object.get(output_obj, inner.id, [])
    merged := array.concat(inner_list, [inner])
    output_obj[inner.id] = merged
}

我发现的唯一选择是内循环(O(n ^ 2)):

output_obj := {i.id : [j | j:= inpt[_]; j.id == i.id] | i := inpt[_]}

综合索引应确保 O(n) 运行时复杂性,因为规则满足条件(您的条件):

package test

output_obj := {id: list |
    some i
    id := input[i].id
    list := [obj |
        some j
        input[j].id == id
        obj := input[j]
    ]
}

暂无
暂无

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

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