JQ:将单个对象分组为键

发布于 2025-01-26 11:00:24 字数 1810 浏览 3 评论 0原文

我有以下数据:

[
  {
    "company.u_ats_region": "Region1",
    "hostname": "host1",
    "install_status": "1",
    "os": "Windows",
    "os_domain": "test.com"
  },
  {
    "company.u_ats_region": "Region2",
    "hostname": "host2",
    "install_status": "1",
    "os": "Windows",
    "os_domain": "test.com"
  },
  {
    "company.u_ats_region": "Region3",
    "hostname": "host3",
    "install_status": "7",
    "os": "Windows",
    "os_domain": "test.com"
  }
]

我一直在使用此查询

{count: length,
 regions: [group_by(."company.u_ats_region")[] | 
          {( [0]."company.u_ats_region"): [.[] | 
          {name: (.hostname+"."+.os_domain), 
      os: .os}]}]}

将数据转换为以下内容:

{
  "count": 3,
  "regions": [
    {
      "Region1": [
        {
          "name": "host1.test.com",
          "os": "Windows"
        }
      ]
    },
    {
      "Region2": [
        {
          "name": "host2.test.com",
          "os": "Windows"
        }
      ]
    },
    {
      "Region3": [
        {
          "name": "host3.test.com",
          "os": "Windows"
        }
      ]
    }
  ]
}

这接近我要实现的目标,但我希望“区域”成为一个对象,每个区域是一个对象这样的对象中的关键:

{
  "count": 3,
  "regions": {
      "Region1": [
        {
          "name": "host1.test.com",
          "os": "Windows"
        }
      ],
      "Region2": [
        {
          "name": "host2.test.com",
          "os": "Windows"
        }
      ],
      "Region3": [
        {
          "name": "host3.test.com",
          "os": "Windows"
        }
      ]
    }
}

我尝试使用“添加”来玩耍,但这仍然没有使我更接近我试图实现的结果。任何帮助都将受到赞赏!

I have the following data:

[
  {
    "company.u_ats_region": "Region1",
    "hostname": "host1",
    "install_status": "1",
    "os": "Windows",
    "os_domain": "test.com"
  },
  {
    "company.u_ats_region": "Region2",
    "hostname": "host2",
    "install_status": "1",
    "os": "Windows",
    "os_domain": "test.com"
  },
  {
    "company.u_ats_region": "Region3",
    "hostname": "host3",
    "install_status": "7",
    "os": "Windows",
    "os_domain": "test.com"
  }
]

And I've been using this query

{count: length,
 regions: [group_by(."company.u_ats_region")[] | 
          {( [0]."company.u_ats_region"): [.[] | 
          {name: (.hostname+"."+.os_domain), 
      os: .os}]}]}

to convert the data into the following:

{
  "count": 3,
  "regions": [
    {
      "Region1": [
        {
          "name": "host1.test.com",
          "os": "Windows"
        }
      ]
    },
    {
      "Region2": [
        {
          "name": "host2.test.com",
          "os": "Windows"
        }
      ]
    },
    {
      "Region3": [
        {
          "name": "host3.test.com",
          "os": "Windows"
        }
      ]
    }
  ]
}

This is close to what I'm trying to achieve but I would like 'regions' to be a single object with each region being a key within that object like this:

{
  "count": 3,
  "regions": {
      "Region1": [
        {
          "name": "host1.test.com",
          "os": "Windows"
        }
      ],
      "Region2": [
        {
          "name": "host2.test.com",
          "os": "Windows"
        }
      ],
      "Region3": [
        {
          "name": "host3.test.com",
          "os": "Windows"
        }
      ]
    }
}

I have tried playing around with 'add' but that still didn't bring me any closer to the result I'm trying to achieve. Any help is appreciated!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

云胡 2025-02-02 11:00:24

使用value字段创建对象,然后使用from_entries是一种方法:

{
  count: length,
  regions: group_by(."company.u_ats_region")
  | map({
      key: .[0]."company.u_ats_region",
      value: map({name: "\(.hostname).\(.os_domain)", os})
    })
  | from_entries
}
{
  "count": 3,
  "regions": {
    "Region1": [
      {
        "name": "host1.test.com",
        "os": "Windows"
      }
    ],
    "Region2": [
      {
        "name": "host2.test.com",
        "os": "Windows"
      }
    ],
    "Region3": [
      {
        "name": "host3.test.com",
        "os": "Windows"
      }
    ]
  }
}

demo

Creating an object with key and value fields, then using from_entries would be one way:

{
  count: length,
  regions: group_by(."company.u_ats_region")
  | map({
      key: .[0]."company.u_ats_region",
      value: map({name: "\(.hostname).\(.os_domain)", os})
    })
  | from_entries
}
{
  "count": 3,
  "regions": {
    "Region1": [
      {
        "name": "host1.test.com",
        "os": "Windows"
      }
    ],
    "Region2": [
      {
        "name": "host2.test.com",
        "os": "Windows"
      }
    ],
    "Region3": [
      {
        "name": "host3.test.com",
        "os": "Windows"
      }
    ]
  }
}

Demo

甩你一脸翔 2025-02-02 11:00:24

您可以定义a 自定义函数执行分组,然后将结果转换为tranfsorm。使用功能避免重复选择器:

def group_to_obj(f):
  group_by(f) | map({key:first|f, value:.}) | from_entries;

{
  count: length,
  regions: group_to_obj(."company.u_ats_region")
    | map_values(map({name: "\(.hostname).\(.os_domain)", os}))
}

输出:

{
  "count": 3,
  "regions": {
    "Region1": [
      {
        "name": "host1.test.com",
        "os": "Windows"
      }
    ],
    "Region2": [
      {
        "name": "host2.test.com",
        "os": "Windows"
      }
    ],
    "Region3": [
      {
        "name": "host3.test.com",
        "os": "Windows"
      }
    ]
  }
}

You can define a custom function which performs the grouping and then tranfsorm the result. Using a function avoids having to repeat the selector:

def group_to_obj(f):
  group_by(f) | map({key:first|f, value:.}) | from_entries;

{
  count: length,
  regions: group_to_obj(."company.u_ats_region")
    | map_values(map({name: "\(.hostname).\(.os_domain)", os}))
}

Output:

{
  "count": 3,
  "regions": {
    "Region1": [
      {
        "name": "host1.test.com",
        "os": "Windows"
      }
    ],
    "Region2": [
      {
        "name": "host2.test.com",
        "os": "Windows"
      }
    ],
    "Region3": [
      {
        "name": "host3.test.com",
        "os": "Windows"
      }
    ]
  }
}
青衫儰鉨ミ守葔 2025-02-02 11:00:24

使用降低迭代构建数组是另一种方法:

{
  count: length,
  regions: (
    reduce .[] as $i ({};
      .[$i."company.u_ats_region"] += [$i | {name: "\(.hostname).\(.os_domain)", os}]
    )
  )
}
{
  "count": 3,
  "regions": {
    "Region1": [
      {
        "name": "host1.test.com",
        "os": "Windows"
      }
    ],
    "Region2": [
      {
        "name": "host2.test.com",
        "os": "Windows"
      }
    ],
    "Region3": [
      {
        "name": "host3.test.com",
        "os": "Windows"
      }
    ]
  }
}

demo

Using reduce to iteratively build up the arrays would be another way:

{
  count: length,
  regions: (
    reduce .[] as $i ({};
      .[$i."company.u_ats_region"] += [$i | {name: "\(.hostname).\(.os_domain)", os}]
    )
  )
}
{
  "count": 3,
  "regions": {
    "Region1": [
      {
        "name": "host1.test.com",
        "os": "Windows"
      }
    ],
    "Region2": [
      {
        "name": "host2.test.com",
        "os": "Windows"
      }
    ],
    "Region3": [
      {
        "name": "host3.test.com",
        "os": "Windows"
      }
    ]
  }
}

Demo

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文