gpt4 book ai didi

json - 交换键和数组值,将旧键转换为新数组值,使用 jq

转载 作者:行者123 更新时间:2023-12-03 07:51:26 24 4
gpt4 key购买 nike

我想反转一些数据的键和值,其中值是数组,这样值数组的每个唯一元素都成为输出中的键,其值是包含每个输入键的数组,其值包含最初是该元素。

举个例子,我有一些这样的数据:

[
{
"Id": "abc",
"Contents": [
"foo",
"bar"
]
},
{
"Id": "def",
"Contents": [
"foo",
"baz",
"ding"
]
},
{
"Id": "ghi",
"Contents": [
"bar",
"dang",
"baz"
]
}
]

我想得到以下输出:

{
"foo": [
"abc",
"def"
],
"bar": [
"abc",
"ghi",
],
"baz": [
"def",
"ghi"
],
"ding": [
"def"
],
"dang": [
"ghi"
]
}

根据本网站上的其他问题,我尝试了以下操作,但在使用 reduce 时,我一直试图避免破坏结果。我知道我已经很接近了,我只是在处理嵌套数据方面遇到了困难。

map(.Id as $Id
| .Contents
| map({key: ., value: [$Id]})
| from_entries
)
| reduce .[] as $item ({}; . * $item)

这段代码的问题在于,虽然它确实返回了我想要的结构中的数据,但它破坏了这些值。这是它现在输出的内容:

{
"foo": [
"def"
],
"bar": [
"ghi"
],
"baz": [
"ghi"
],
"ding": [
"def"
],
"dang": [
"ghi"
]
}

我尝试过嵌套 reduce 调用,但没有效果,我只是对语法不满意。我可以用其他语言处理这个问题,但我真的很想用 jq 来处理。我错过了什么?

最佳答案

您只需使用reduce即可做到这一点:

reduce .[] as {$Id, $Contents} ({}; .[$Contents[]] += [$Id])
{
"foo": [
"abc",
"def"
],
"bar": [
"abc",
"ghi"
],
"baz": [
"def",
"ghi"
],
"ding": [
"def"
],
"dang": [
"ghi"
]
}

https://jqplay.org/s/qSACI2lkcW3

关于json - 交换键和数组值,将旧键转换为新数组值,使用 jq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77026555/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com