【问题标题】:jq - merge values of objects having the same key/value and add them to an array in a related objectjq - 合并具有相同键/值的对象的值并将它们添加到相关对象的数组中
【发布时间】:2021-04-30 13:39:07
【问题描述】:

这个问题有点复杂,将this question 带到了一个新的水平。

我想举一个例子来描述我的问题。假设我有以下输入:

[
  {
    "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/import",
    "body_payload": {
      "name": "assignment2",
      "description": "assignment 2 description"
    }
  },
  {
    "endpoint_url": "assignment-role/create",
    "body_payload": {
      "roleName": "role3",
      "assignmentName": "assignment2"
    }
  },
  {
    "endpoint_url": "assignment-role/create",
    "body_payload": {
      "roleName": "role4",
      "assignmentName": "assignment2"
    }
  },
  {
    "endpoint_url": "assignment-role/create",
    "body_payload": {
      "roleName": "role5",
      "assignmentName": "assignment2"
    }
  },
  {
    "endpoint_url": "assignment/import",
    "body_payload": {
      "name": "assignment3",
      "description": "assignment 3 description"
    }
  },
  {
    "endpoint_url": "assignment-role/create",
    "body_payload": {
      "roleName": "role6",
      "assignmentName": "assignment3"
    }
  },
]

预期的输出可能是这样的:

[
  {
    "endpoint_url": "assignment/import",
    "body_payload": {
      "name": "assignment1",
      "description": "assignment 1 description",
      "roles": [ "role1", "role2" ]
    }
  },
  {
    "endpoint_url": "assignment/import",
    "body_payload": {
      "name": "assignment2",
      "description": "assignment 2 description",
      "roles": [ "role3", "role4", "role5" ]
    }
  },
  {
    "endpoint_url": "assignment/import",
    "body_payload": {
      "name": "assignment3",
      "description": "assignment 3 description",
      "roles": [ "role6" ]
    }
  }
]

我希望您能看到我希望执行以下操作。对于具有assignment/import 的每个对象,我想提取相应assignment-role/create 的所有角色(具有assignment-role/create 的对象,其assignmentName 等于具有assignment/import 的相应对象的name)并添加这些角色给它。
我的描述可能有点笨拙,但我希望这个例子能说明本质。

【问题讨论】:

    标签: jq


    【解决方案1】:

    您的数组中有两种不同的对象类型。它们由.body_payload 的子键区分,所以让我们解构所有键并检查哪些不为空。我们将为此使用reduce/2,因为我们需要重复更新树的相同部分。

    reduce .[] as
      { body_payload:
        { $name
        , $description
        , $roleName
        , $assignmentName
        }
      }
    ( null
    ; if $name and $description
      then .[$name] += {$name, $description}
    
      elif $roleName and $assignmentName
      then .[$assignmentName].roles += [$roleName]
    
      else error("some required parameter is null")
      end
    )
    

    这会产生一个形式的对象

    {
      "assignment1": {
        "name": "assignment1",
        "description": "assignment 1 description",
        "roles": [
          "role1",
          "role2"
        ]
      },
      "assignment2": {
         ...
      },
      ...
    }
    

    我们可以使用to_entries|map 将其转换为所需的对象数组。

    | to_entries
    | map
      ( { endpoint_url: "assignment/import"
        , body_payload: .value
        }
      )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-08
      • 2019-07-27
      • 1970-01-01
      相关资源
      最近更新 更多