jq-在对象中创建一个数组,并将共享相同值的对象的所有值添加到该数组中 [英] jq - Create an array in an object and add to it all values of objects that share a same value
问题描述
我正在尝试建立以下结构
I am trying to make the following structure
{
"endpoint_url": "assignment/import",
"body_payload": {
"name": "assignment1",
"description": "assignment 1 description"
}
}
...
{
"endpoint_url": "assignment-role/create",
"body_payload": {
"roleName": "role1",
"assignmentName": "assignment1"
}
},
{
"endpoint_url": "assignment-role/create",
"body_payload": {
"roleName": "role2",
"assignmentName": "assignment1"
}
},
{
"endpoint_url": "assignment-role/create",
"body_payload": {
"roleName": "role3",
"assignmentName": "assignment1"
}
}
成为
{
"endpoint_url": "assignment/import",
"body_payload": {
"name": "assignment1",
"description": "assignment 1 description",
"roles": [ "role1", "role2", "role3" ]
}
}
...
想法如下:
对于满足 .endpoint_url =="assignment/import"
的每个对象,请标识具有相同分配名称的对象(例如, .body_payload.name == .body_payload.assignmentName
),然后将角色名称添加到角色数组中(例如 if .body_payload.roles然后.body_payload.roles + = .body_payload.roleName else .body_payload + = {" roles:[]} end
For each object that satisfies .endpoint_url == "assignment/import"
identify the objects that have the same assignment name (e.g. .body_payload.name == .body_payload.assignmentName
) and add the role name to the roles array (e.g. if .body_payload.roles then .body_payload.roles += .body_payload.roleName else .body_payload += {"roles": []} end
我确信这种程序化方法是不正确的.我最好不要显示自己的尝试(也是非常错误的),并想问一个知识渊博的人,什么是达到预期结果的正确方法.
I am sure this programmatic approach is not correct. I better refrain from showing what I have tried (and is awfully wrong too) and would like to ask a knowledgable person what is the correct way to achieve the expected result.
有效的最小输入可以如下:
A valid minimal input can be as follows:
[
{
"endpoint_url": "assignment/import",
"body_payload": {
"name": "assignment1",
"description": "assignment 1 description"
}
},
{
"endpoint_url": "assignment-role/create",
"body_payload": {
"roleName": "role1",
"assignmentName": "assignment1"
}
},
{
"endpoint_url": "assignment-role/create",
"body_payload": {
"roleName": "role2",
"assignmentName": "assignment1"
}
},
{
"endpoint_url": "assignment-role/create",
"body_payload": {
"roleName": "role3",
"assignmentName": "assignment1"
}
}
]
预期输出可以是:
{
"endpoint_url": "assignment/import",
"body_payload": {
"name": "assignment1",
"description": "assignment 1 description",
"roles": [ "role1", "role2", "role3" ]
}
}
尽管我真的不太在乎先前/旧的对象是否仍然存在.您发现最容易做的事都可以.
Though I do not care too much really if the previous/old objects still are there. Whatever you find easiest to do is ok.
推荐答案
使用 jq
的一种方法是
jq '
( map ( select( .endpoint_url == "assignment/import" ) ) ) as $d |
( map ( select( .body_payload.assignmentName == $d[].body_payload.name ) ) ) as $l |
$d |
map( .body_payload += { roles : [ $l[].body_payload.roleName ] } )' json
这篇关于jq-在对象中创建一个数组,并将共享相同值的对象的所有值添加到该数组中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!