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

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

[
  {
    "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"
  ]
}

基于这个网站上的其他问题,我已经try 了以下方法,但我在使用reduce的时候试图避免冲击结果.我知道我已经很接近了,我只是在努力处理嵌套的数据.

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

这段代码的问题在于,虽然它确实返回了我想要的 struct 中的数据,但它 destruct 了值.这就是它现在的输出:

{
  "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打印每个根级对象键一行?

解析JSON说函数parse_json不存在?

当由.sh脚本执行时,AWS查询字符串不会提取任何数据

递归解码嵌套列表(具有任意深度的列表列表)

为什么 Django Rest API 序列化器没有正确序列化多对多字段

Jolt - 如何比较 if else 条件的两个值

JOLT 在 struct 体中间添加一个 JSON 字段

根据数据框中的其他列值将列表 json 对象插入行

在循环中将变量添加到 bash 数组

了解 JSON Schema 草稿版本 4 中的additionalProperties关键字

如何通过 NSJSONSerialization 在 JSON 中包含空值?

使用 JSONObject 在 Java 中为以下 struct 创建嵌套 JSON 对象?

如何使用 Jackson 重命名 JSON 序列化中的根键

在视图中将 .Net 对象转换为 JSON 对象

如何安装 json gem - 无法构建 gem 原生扩展(mac 10.10)

可以在 SharedPreferences 中保存 JSON 数组吗?

无法将空值放入 JSON 对象

java.lang.BootstrapMethodError:调用站点#4 bootstrap 方法的异常,初始化 retrofit 时

Microsoft.Net.Http 与 Microsoft.AspNet.WebApi.Client

如何使用 Javascript 将数据写入 JSON 文件