我从一个包含多个对象的JSON文件开始
{
"name": "foo",
"url": "https://zombo.com"
}
{
"name": "bar",
"url": "https://acme.com"
}
并且我正在尝试将这些结合到一个对象中,并以name
属性为键:
{
"widgets": {
"foo": {
"url": "https://zombo.com"
},
"bar": {
"url": "https://acme.com"
}
}
}
一段时间以来,我一直对此感到头疼,我认为我与以下查询相当接近:
{ widgets: (reduce . as $item ({}; . + {($item.name): {url: $item.url}})) }
但是,这会导致多个对象,而我的想法也用光了。
jqplay在这里可用:https://jqplay.org/s/SI7XEMb5l9。
答案 0 :(得分:4)
我会像this那样做:
jq -s '{ widgets: map( { (.name): {url} } ) | add }'
-s
(--slurp
)将对象合并为对象数组map( { (.name): { url } } )
重塑每个对象add
将数组元素串联为单个对象{ widgets: ... }
构建对象。答案 1 :(得分:2)
将reduce
与inputs
一起使用:
jq -n '{ widgets : (reduce inputs as $p ({}; . + ($p | { (.name) : { url } }))) }' file