我有这个输入JSON数组(已经对turborepo的--ry-run=json输出进行了稍微的预处理)

{
  "package": "@nullvoxpopuli/dev",
  "task": "_syncPnpm",
  "local": false,
  "remote": false,
  "status": "MISS",
  "timeSaved": 0
}
{
  "package": "@nullvoxpopuli/dev",
  "task": "test",
  "local": false,
  "remote": false,
  "status": "MISS",
  "timeSaved": 0
}
{ 
  "package": "another-package",
  ...
  ... etc

我想将此数据转换为以下形式:

{
  "@nullvoxpopuli/dev": {
    "_syncPnpm": {
      "local": false,
      "remote": false,
      "status": "MISS",
      "timeSaved": 0
    },
    "test": {
      "local": false,
      "remote": false,
      "status": "MISS",
      "timeSaved": 0  
    }
  }
}

此转换的方案(e|a)为:

{
  [package]: {
    [task]: {
      ...the other fields
    }
  }
}

这将允许我使用GitHub操作根据缓存状态跳过作业(job),这将有助于保护环境

在我将解决方案带到命令行之前,我一直在使用https://jqplay.org/测试东西,我的大部分问题只是因为我不够了解JQ的基础.

我认为我需要使用REDUTE,但是构建新的嵌套对象让我无法理解.

ChatGPT建议这样做:

reduce .[] as $item ({};
    .[$item.package][$item.task] += [$item]
)

但这给了我一个错误:

jq: error (at <stdin>:1072): Cannot index string with string "task"
exit status 5

我不知道该怎么办. 它sounds就像是试图迭代一个字符串,但我不知道它为什么要这样做? 错误可以定义得更清楚.

我还找到了这个网站:https://remysharp.com/drafts/jq-recipes 这通常意味着同样的事情--至少REDUTE语法看起来是正确的. 也许这是ChatGPT错误的嵌套对象创建部分. (这也是很难在谷歌上搜索的东西,我还没有找到任何人在做我想要的事情)

我还try 了在JavaScript中使用的一种技术来处理这类事情,但我也不认为这是正确的:

reduce .[] as $item ({};
    .[$item.package] ||= {}
    .[$item.package][$item.task] ||= {}
    .[$item.package][$item.task] += [$item]
)

当我收到错误时:

jq: error: syntax error, unexpected |= (Unix shell quoting issues?) at <top-level>, line 4:
    .[$item.package] ||= {}                      
jq: 1 compile error
exit status 3

所以..我不知道JQ有没有"or,equals"的概念

这是我的JQ-Play链接:https://jqplay.org/s/mFZdK_Gz4WE

推荐答案

您的输入似乎是对象流.你的 idea 是正确的,但执行是错误的.||=不是有效的语法,您的意思可能是|=.

您可以使用JQ的模式绑定语法来提取对象的某些属性,其方式与Java脚本类似.尽管没有针对非绑定属性的"REST"语法,但我们可以解决这个问题.然后构建结果.您可以在这里使用快捷方式,因为JQ在执行属性赋值时会假定一个对象.

$ jq -n 'reduce (inputs|[.,del(.package,.task)]) as [{$package,$task},$rest] ({};
  .[$package][$task] |= $rest
)'
{
  "@nullvoxpopuli/dev": {
    "_syncPnpm": {
      "local": false,
      "remote": false,
      "status": "MISS",
      "timeSaved": 0
    },
    "test": {
      "local": false,
      "remote": false,
      "status": "MISS",
      "timeSaved": 0
    }
  }
}

jqplay

Json相关问答推荐

从JSON格式提取数据时分隔通用名称

对面的行/列进行排序时可能出现错误

Allof Indide的JSON模式之一

使用Jolt v.0.1.1向每个json元素添加一个键-值对

将JSON数组组织到菜单中

如何使用Powershell查找所有包含特定键值对的JSON对象并迭代所有对象?

如何使用SQLite Trigger将JSON对象数组转换为新记录?

jq可以在两个JSON对象列表中依次添加对象吗?

使用杰克逊解析Kotlin 中的通用密封类

如何让 JSON.NET 忽略对象关系?

JQuery,使用 GET 方法发送 JSON 对象

在 Rails 3 中处理 JS/ERB 模板中的 JSON

在 Jersey 服务中使用 JSON 对象

使用杰克逊创建一个 json 对象

为不同类型的项目数组正确的 JSON Schema

Retrofit2.0 得到 MalformedJsonException 而 json 似乎正确?

有什么方法可以判断您安装的 gulp 版本吗?

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

运算符不存在:json = json

从调试器获取 IntelliJ Idea 中的 JSON 对象