我有这个输入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