jq-在对象中创建一个数组,并将共享相同值的对象的所有值添加到该数组中 [英] jq - Create an array in an object and add to it all values of objects that share a same value

查看:54
本文介绍了jq-在对象中创建一个数组,并将共享相同值的对象的所有值添加到该数组中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试建立以下结构

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆