我有类似的东西:
jq --arg START 10 '[.z[] | select(has("name")) | {id: $START | tonumber, name}]'
使用'name'键转换为对象数组,附加增量id,输出:
[
{
id: 10,
name: "stuff"
},
{
id: 10,
name: "more stuff"
}
]
如何增加START arg以使第二个对象的id为11,依此类推?
编辑:我应该发布原始的json:{
"u": "stuff",
"x": [1,2,3],
"y": {
"field": "value"
},
"z": {
"stuffWithoutName": {
"ex": "stuff"
},
"zz": {
"name": "change me",
"more": "stuff"
},
"randomKey": {
"name": "change me",
"random": "more stuff"
}
}
}
谢谢!
答案 0 :(得分:2)
假设你的jq有foreach
:
# emit a stream of {id:_, value: _} objects
def counts(s; start):
foreach s as $i (start-1; .+1; {id:., value: $i});
[ counts(.z[] | select(has("name")); $START|tonumber)
| {id, name: .value.name} ]
由于上面假设你有foreach
,你也可以使用--argjson选项,它允许你将START的值作为JSON号传递。
如果您的jq没有foreach
,则可以轻松修改上述内容以使用reduce
。
根据对问题的修订,看起来您希望您的jq程序具有以下形式:
.z = [ ... ]
或
.z |= [[.[] | select(has("name"))] | to_entries | ...
或同等的。
答案 1 :(得分:2)
您可以使用to_entries
,当给定数组时,它将为每个项目提供索引:
jq --arg START 10 '($START | tonumber) as $s
| [.z[] | select(has("name"))]
| to_entries
| map({name:.value.name, id: ($s + .key) })'
这样,id
从10 + 0
变为10 + n